- •1. Цели и задачи разработки
- •2. Назначение и область применения
- •3. Постановка задачи и разработка алгоритма работы приложения
- •4. Решение задачи с помощью программных средств
- •4.1 Выбор среды разработки
- •4.2 Разработка серверной части
- •4.3 Разработка клиентской части
- •Список используемых источников
- •Приложение 1 Основной программный код серверной части приложения "Чат". Файл "uMainForm.Cpp"
Список используемых источников
А.Я. Архангельский. Программирование в C++Builder. 7-е изд. -М.: ООО "Бином-Пресс", 2010 г. - 1230 с.
С.И. Бобровский. Технологии C++Builder. Разработка приложения для бизнеса. Учебный курс. - СПб.: Питер, 2007
Приложения
Приложение 1 Основной программный код серверной части приложения "Чат". Файл "uMainForm.Cpp"
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UMainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Выбор режима работы
void __fastcall TMainForm::ComboBox_ServerModeChange(TObject *Sender)
{
// Если On-Line, то:
if (ComboBox_ServerMode->ItemIndex == 0)
{
ServerSocket1->Active = True; // активируем ServerSocket1
ServerSocket2->Active = True; // активируем ServerSocket2
// В строке состояния (внизу программы) пишем "Работаем"
StatusBar1->Panels->Items[0]->Text = "Работаем";
}
// Если Off-Line, то деактивируем ServerSocket1 и ServerSocket2
if (ComboBox_ServerMode->ItemIndex == 1)
{
ServerSocket1->Active = False; // деактивируем ServerSocket1
ServerSocket2->Active = False; // деактивируем ServerSocket2
// В строке состояния (внизу программы) пишем "Не работаем"
StatusBar1->Panels->Items[0]->Text = "Не работаем";
ListBox_ClientList->Clear(); // Очищаем список клиентов
}
}
//---------------------------------------------------------------------------
// При завершении работы сервера (при закрытии программы)
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
ServerSocket1->Active = False; // деактивируем ServerSocket1
ServerSocket2->Active = False; // деактивируем ServerSocket2
}
//---------------------------------------------------------------------------
// Когда клиент подсоединился
void __fastcall TMainForm::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
// Добавляем его в список клиентов
ListBox_ClientList->Items->Add("Клиент");
}
//---------------------------------------------------------------------------
// Если произошла ошибка соединения с клиентом
void __fastcall TMainForm::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
// В строке состояния пишем "Ошибка соединения"
StatusBar1->Panels->Items[0]->Text = "Ошибка соединения";
// В списке режимов работы выбираем "Off-Line"
ComboBox_ServerMode->ItemIndex = 1;
ListBox_ClientList->Clear(); // Очищаем список клиентов
}
//---------------------------------------------------------------------------
// Если клиент отсоединился
void __fastcall TMainForm::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ListBox_ClientList->Clear(); // Очищаем список клиентов
}
//---------------------------------------------------------------------------
// Для отправки сообщения/файла клиенту щелкаем в списке клиентов
// строчку "Клиент"
void __fastcall TMainForm::ListBox_ClientListDblClick(TObject *Sender)
{
SendForm->ShowModal(); // Показываем форму для отправки сообщений
}
//---------------------------------------------------------------------------
// В случае, если от клиента пришло текстовое сообщение
void __fastcall TMainForm::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
// Заносим его в окно чата
SendForm->Memo_Chat->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
Приложение 2
Основной программный код серверной части приложения "Чат". Файл " USendForm.cpp"
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "USendForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TSendForm *SendForm;
//---------------------------------------------------------------------------
__fastcall TSendForm::TSendForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// При нажатии на кнопку "Отправить текст"
void __fastcall TSendForm::Button_SendTextClick(TObject *Sender)
{
// Добавляем отправляемый текст в окно чата
Memo_Chat->Lines->Add("Сервер: "+Edit_SendText->Text);
// Отправляем текст клиенту
MainForm->ServerSocket1->Socket->Connections[0]->SendText("Сервер: " +
Edit_SendText->Text);
// Очищаем поле ввода текста
Edit_SendText->Text = "";
}
//---------------------------------------------------------------------------
// Отправка файла клиенту при нажатии кнопки "Отправить файл"
void __fastcall TSendForm::Button_SendFileClick(TObject *Sender)
{
// Открываем диалоговое окно выбора файла
if (SendForm->OpenDialog1->Execute())
{
// Если файл выбран, то используем имя файла
if (SendForm->OpenDialog1->FileName != "")
{
//Открываем файл на чтение и передаем его клиенту
TFileStream* f1 = new TFileStream(SendForm->OpenDialog1->FileName, fmOpenRead);
MainForm->ServerSocket2->Socket->Connections[0]->SendStream(f1);
//Добавляем в окно Чата сообщение, что такой-то файл отправлен
Memo_Chat->Lines->Add("Файл " + OpenDialog1->FileName + " отправлен");
}
}
}
//---------------------------------------------------------------------------
Приложение 3
Основной программный код клиентской части приложения "Чат". Файл "UMainForm.cpp"
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UMainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Выбор режима работы
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();
}
}
//---------------------------------------------------------------------------
// В случае закрытия программы разрываем соединение с сервером
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
ClientSocket1->Active = False; // Деактивируем соединение сокета 1
ClientSocket2->Active = False; // Деактивируем соединение сокета 2
}
//---------------------------------------------------------------------------
// Если произошла ошибка соединения с сервером
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(); // Очищаем список клиентов
}
//---------------------------------------------------------------------------
// При отсоединении от сервера
void __fastcall TMainForm::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
// В списке режимов работы указываем "Off-Line"
ComboBox_ClientMode->ItemIndex = 1;
// В строке состояния программы пишем "Не работаем"
StatusBar1->Panels->Items[0]->Text = "Не работаем";
// Очищаем список клиентов
ListBox_ClientList->Clear();
}
//---------------------------------------------------------------------------
// Для отправки сообщения серверу щелкаем в списке клиентов
// строчку "Сервер"
void __fastcall TMainForm::ListBox_ClientListDblClick(TObject *Sender)
{
SendForm->ShowModal(); // Показываем форму для отправки сообщений
}
//---------------------------------------------------------------------------
// При получении сообщения от сервера добавляем его в окно чата
void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
SendForm->Memo_Chat->Lines->Add(ClientSocket1->Socket->ReceiveText());
}
//---------------------------------------------------------------------------
// Прием файла
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 + " получен");
}
}
}
//---------------------------------------------------------------------------
Приложение 4
Основной программный код клиентской части приложения "Чат". Файл " USendForm.cpp"
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "USendForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TSendForm *SendForm;
//---------------------------------------------------------------------------
__fastcall TSendForm::TSendForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// При нажатии на кнопку "Отправить текст"
void __fastcall TSendForm::Button_SendTextClick(TObject *Sender)
{
// Добавляем отправляемый текст в окно чата
Memo_Chat->Lines->Add("Клиент: "+Edit_SendText->Text);
// Отправляем текст серверу
MainForm->ClientSocket1->Socket->SendText("Клиент: " +
Edit_SendText->Text);
// Очищаем поле ввода текста
Edit_SendText->Text = "";
Размещено на Allbest.ru