- •1. Цели и задачи разработки
- •2. Назначение и область применения
- •3. Постановка задачи и разработка алгоритма работы приложения
- •4. Решение задачи с помощью программных средств
- •4.1 Выбор среды разработки
- •4.2 Разработка серверной части
- •4.3 Разработка клиентской части
- •Список используемых источников
- •Приложение 1 Основной программный код серверной части приложения "Чат". Файл "uMainForm.Cpp"
4.3 Разработка клиентской части
Создадим новый проект, на форме разместим компоненты согласно рисунка 4.3.1.
Рис. 4.3.1 Внешний вид формы клиентской части приложения "Чат"
Значения свойств формы и свойств компонент, размещенных на форме приведены в таблице 4.3.1.
Табл. 4.3.1 Основные значения свойств формы и свойств компонент, размещенных на форме клиентской части приложения
-
Свойство
Значение
Окно формы TForm
Name
MainForm
Caption
Чат: клиент
Height
300
Width
210
TGroupBox
Name
GroupBox_Options
Caption
Найстройки
TLabel
Name
Label_IPadress
Caption
IP-адрес сервера
TEdit
Name
Edit_IPadress
Text
127.0.0.1
TGroupBox
Name
GroupBox_ClientMode
Caption
Режим работы
TCombobox
Name
ComboBox_ClientMode
Items
On-Line | Off-Line
ItemIndex
1
TGroupBox
Name
GroupBox_ClientList
Caption
Список клиентов
TListBox
Name
ListBox_ClientList
TClientSocket
Name
ClientSocket1
Active
False
Address
127.0.0.1
Port
2000
ServerType
stNonBlocking
TClientSocket
Name
ClientSocket2
Active
False
Address
127.0.0.1
Port
3000
ServerType
stNonBlocking
TStatusBar
Name
StatusBar1
Panels
0 - TStatusPanel
Добавим форму к проекту, разместим компоненты согласно рисунка 4.3.2.
Рис. 4.3.2 Внешний вид формы клиентской части приложения Чат, предназначенной для отправки сообщений и приема файлов
Значения свойств формы и свойств компонент, размещенных на форме приведены в таблице 4.3.2.
Табл. 4.2.2 Основные значения свойств формы и свойств компонент, размещенных на форме, предназначенной для отправки сообщений и приема файлов
-
Свойство
Значение
Окно формы TForm
Name
SendForm
Caption
Отправка-прием
Height
160
Width
380
TMemo
Name
Memo_Chat
Lines
пусто
ReadOnly
True
TEdit
Name
Edit_SendText
Text
пусто
TButton
Name
Button_SendText
Caption
Отправить текст
TSaveDialog
Name
SaveDialog1
Далее необходимо написать обработчики возможных событий, которые могут произойти во время работы клиентской части приложения "Чат", реализовать логику работы программы.
При запуске клиентской части программы "Чат" необходимо указать IP-адрес сервера и выбрать режим работы "On-Line" (рис. 4.3.3). Если сервер и клиент запускаются на одном и том же компьютере, то можно ввести в качестве IP-адреса – 127.0.0.1
Рис. 4.3.3 Окно клиентской части приложения после запуска
В Borland C++ Builder 6 для организации клиент-серверных приложений можно использовать такие компоненты как TServerSocket и TClientSocket. На клиенте будем использовать две компоненты TClientSocket – одну для обмена сообщениями, другую для обмена файлами.
После ввода параметров соединения и выбора режима работы "On-Line" обе компоненты TClientSocket активируются и пытаются подключиться к серверу. В случае удачного подключения к серверу, сервер добавляется в список клиентов. В режиме "Off-Line" обе компоненты TClientSocket деактивируются, и разрывают соединение с сервером.
// Выбор режима работы
void __fastcall TMainForm::ComboBox_ClientModeChange(TObject *Sender)
{
// Если On-Line
if (ComboBox_ClientMode->ItemIndex == 0)
{
// Присваиваем IP-адрес сервера свойству Address сокета 1
ClientSocket1->Address = Edit_IPadress->Text;
ClientSocket1->Active = True; // соединяемся с сервером
// Присваиваем IP-адрес сервера свойству Address сокета 2
ClientSocket2->Address = Edit_IPadress->Text;
ClientSocket2->Active = True; // соединяемся с сервером
// В строке состояния (внизу) программы пишем "Работаем"
StatusBar1->Panels->Items[0]->Text = "Работаем";
// В список клиентов добавляем "Сервер"
ListBox_ClientList->Items->Add("Сервер");
}
// Если Off-Line
if (ComboBox_ClientMode->ItemIndex == 1)
{
ClientSocket1->Active = False;//Деактивируем соединение сокета 1
ClientSocket2->Active = False;//Деактивируем соединение сокета 2
// В строке состояния программы пишем "Не работаем"
StatusBar1->Panels->Items[0]->Text = "Не работаем";
// Очищаем список клиентов
ListBox_ClientList->Clear();
}
}
Если произошла ошибка соединения с сервером, то в строке состояния сообщаем об этом. Также переводим клиента в режим "Off-line" и очищаем список клиентов.
// Если произошла ошибка соединения с сервером
void __fastcall TMainForm::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
// В строке состояния пишем "Ошибка соединения"
StatusBar1->Panels->Items[0]->Text = "Ошибка соединения";
// В списке режимов работы выбираем "Off-Line"
ComboBox_ClientMode->ItemIndex = 1;
ListBox_ClientList->Clear(); // Очищаем список клиентов
}
В случае удачного подключения к серверу можно начинать отправку сообщений и прием файлов. Для этого нужно сделать двойной щелчок мышью на имени сервера в списке клиентов. После чего откроется окно "Отправка-прием" (рис. 4.3.4).
Обработчик события при щелчке на имени сервера в списке клиентов следующий.
// Для отправки сообщения серверу щелкаем в списке клиентов
// строчку "Сервер"
void __fastcall TMainForm::ListBox_ClientListDblClick(TObject *Sender)
{
SendForm->ShowModal(); // Показываем форму для отправки сообщений
}
Рис. 4.3.4 Основное окно клиента и окно "Отправка-прием"
Текст набираем в поле ввода, после чего нажимаем на кнопку "Отправить текст". Обработчик события для этой кнопки следующий.
// При нажатии на кнопку "Отправить текст"
void __fastcall TSendForm::Button_SendTextClick(TObject *Sender)
{
// Добавляем отправляемый текст в окно чата
Memo_Chat->Lines->Add("Клиент: "+Edit_SendText->Text);
// Отправляем текст серверу
MainForm->ClientSocket1->Socket->SendText("Клиент: " +
Edit_SendText->Text);
// Очищаем поле ввода текста
Edit_SendText->Text = "";
}
Для приема файла служит компонента ClientSocket2. При получении файла от сервера выполняется следующий обработчик события.
// Прием файла
void __fastcall TMainForm::ClientSocket2Read(TObject *Sender,
TCustomWinSocket *Socket)
{
ShowMessage("Принимается файл...");
//Открывается диалог сохранения файла
if (SendForm->SaveDialog1->Execute())
{
//Если указали имя файла при сохранении файла
if (SendForm->SaveDialog1->FileName != "")
{
Pointer buff; // объявляем буфер
int iLen; // указываем длину буфера
// Создаем файл
TFileStream* f2=new TFileStream(SendForm->SaveDialog1->FileName, fmCreate);
// уточняем размер данных, полученных от сервера
iLen = ClientSocket2->Socket->ReceiveLength();
// выделяем память для буфера
buff = GetMemory(iLen);
//копируем буфер сокета в буфер buff
ClientSocket2->Socket->ReceiveBuf(buff,iLen);
//передаем данные из буфера buff в файл
f2->Write(buff,iLen);
f2->Free();
// добавляем в окно чата сообщение, что файл полуен
SendForm->Memo_Chat->Lines->Add("Файл " + SendForm->SaveDialog1->FileName + " получен");
}
}
}
При получении сообщения от сервера добавляем его в окно чата, расположенное на форме "Отправка-прием".
// При получении сообщения от сервера добавляем его в окно чата
void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
SendForm->Memo_Chat->Lines->Add(ClientSocket1->Socket->ReceiveText());
}
При отключении клиента от сервера выбираем в списке режимов режим "Off-Line", в строке состояния программы указываем "Не работаем", очищаем список клиентов.
// При отсоединении от сервера
void __fastcall TMainForm::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
// В списке режимов работы указываем "Off-Line"
ComboBox_ClientMode->ItemIndex = 1;
// В строке состояния программы пишем "Не работаем"
StatusBar1->Panels->Items[0]->Text = "Не работаем";
// Очищаем список клиентов
ListBox_ClientList->Clear();
}
При завершении работы клиента, при закрытии программы, деактивируем сокеты 1 и 2.
// В случае закрытия программы разрываем соединение с сервером
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
ClientSocket1->Active = False; // Деактивируем соединение сокета 1
ClientSocket2->Active = False; // Деактивируем соединение сокета 2
}
Все вышеприведенные свойства компонент и обработчики событий вводятся непосредственно в среде разработки программного обеспечения - Borland C++ Builder 6, во время разработки приложения. Выделив нужную компоненту из тех, что мы разместили на форме, нужно выбрать в Инспекторе объектов (Object Inspertor) среды Borland C++ Builder 6 то или иное свойство на вкладке Properties или событие на вкладке Events, изменить значение свойства или написать обработчик события.
Заключение
В данной работе необходимо было разработать клиент-серверное приложение "Чат" с возможностью файлового обмена. Для разработки приложение использовалась интегрированная среда разработки Borland C++ Builder 6. Главным преимуществом данной среды является быстрота разработки программного обеспечения, благодаря наличию визуальных средств проектирования приложения, таких, как формы и набор визуальных и невизуальных компонент, обладающих богатым функционалом.
В ходе проектирования приложения было принято решение о реализации приложения в виде двух программ – клиентской и серверной части. Был разработан примерный алгоритм работы каждой из частей.
Заключительным этапом явилась непосредственная реализация серверной и клиентской части в среде разработки программного обеспечения Borland C++ Builder 6. Полученная программа работает, имеет необходимую функциональность – возможность передачи текста и файлов между двумя компьютерами, подключенными к локальной вычислительной сети. Отправка файлов реализована на стороне сервера, прием – на стороне клиента. Отправка и прием текстовых сообщений реализованы как на стороне сервера, так и на стороне клиента.