Реализация приложения по двунаправленному обмену текстовой и двоичной (бинарной) информацией

Методы программирования обмена данными в сетях TCP/IP с использованием компонентов ServerSocket ClientSocket среды разработки C++ Builder в ОС Windows. Компоненты ServerSocket и ClientSocket, справочная система C++ Builder. Реализация прикладных функций.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 04.11.2012
Размер файла 58,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Цель работы:

Овладеть теоретическим материалом и практическими навыками по методам программирования обмена данными в сетях TCP/IP с использованием компонентов ServerSocket ClientSocket среды разработки C++ Builder в ОС Windows; изучить компоненты ServerSocket и ClientSocket используя справочную систему C++ Builder; самостоятельно реализовать прикладные функции изложенные в задании на работу.

Задание:

1. Изучить теоретический материал

2. Овладеть применяемой терминологией

3. Получить практический опыт программирования обмена данными в сетях TCP/IP

Реализовать собственное приложение по двунаправленному обмену текстовой и двоичной (бинарной) информацией. Приложение должно позволять задавать такие параметры соединения как адрес и номер порта подключения в процессе выполнения, а не только в момент проектирования. Отслеживать статус соединения и не допускать появления ошибки из-за попытки передачи информации при отсутствующем соединении.

Программа, разработанная в процессе выполнения лабораторной работы должна реализовать следующие функциональные возможности:

1. Выполнять функции, как сервера, так и клиента при установлении соединения в зависимости от выбранного режима.

2. Обеспечить двунаправленную передачу информации.

3. Способной передавать текстовые сообщения (Чат). Отправка данных должна происходить по нажатию комбинации клавиш Shift + Enter.

4. Способной передавать файлы. Для выбора передаваемого файла рекомендуется использование компонента OpenDialog, а при выборе имени сохраняемого файла рекомендуется использование компонента SaveDialog.

5. Способной передавать команды управления.

Результаты работы:

Разработанная программа выполняет функции, как сервера, так и клиента в зависимости от выбранного режима; позволяет указывать порт соединения, адрес соединения клиента; отправлять сообщения (чат) как клиенту, так и серверу; отправлять сообщения по нажатию Shift+Enter; отправлять файлы, как клиенту, так и серверу; выключать клиент с сервера; выключать сервер с клиента. Окно программы представлено на рисунке 1.

Рисунок 1 - Окно программы.

Листинг программы:

// ---------------------------------------------------------------------------

#include <vcl. h>

#pragma hdrstop

#include "Unit1. h"

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"

TForm1 *Form1;

TMemoryStream *MS=new TMemoryStream; // создаем поток

int Size; // размер переданного файла

bool Receive; // передаем ли мы на данный момент файл

AnsiString FileName; // имя файла

int i=0,j; // i-вкл/выкл j-клиент/сервер

// ---------------------------------------------------------------------------

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{

Memo1->Clear ();

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ClientConnect (TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add ("Сообщение: Соединение с сервером установлено");

Button2->Enabled=true;

Button3->Enabled=true;

Button6->Enabled=true;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ClientDisconnect (TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add ("Сообщение: Соединение с сервером разорвано");

Edit2->Enabled=true;

Button2->Enabled=false;

Button3->Enabled=false;

Button6->Enabled=false;

Button5->Enabled=true;

Button1->Caption="Подключится";

i=0;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ClientError (TObject *Sender,

TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)

{

ErrorCode=0;

ShowMessage (" Невозможно подключится ");

Client->Active=false;

Button5->Enabled=true;

Edit2->Enabled=true;

Button1->Caption="Подключится";

i=0;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ServerClientConnect (TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add ("Сообщение: Клиент подключился");

Button2->Enabled=true;

Button3->Enabled=true;

Button6->Enabled=true;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ServerClientDisconnect (TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add ("Сообщение: Клиент отключился");

Button2->Enabled=false;

Button3->Enabled=false;

Button6->Enabled=false;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ServerClientError (TObject *Sender,

TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)

{

ErrorCode=0;

ShowMessage (" Ошибка сервера ");

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: FormDestroy (TObject *Sender)

{

Client->Close ();

Server->Close ();

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button1Click (TObject *Sender) // Вкл/выкл сервер или подключится/отключится клиентом

{

if (j==1)

{

if (i==0)

{

Client->Port=StrToInt (Edit2->Text); // порт

Client->Active=true;

Button5->Enabled=false;

Edit2->Enabled=false;

Button1->Caption="Отключится";

i=1;

}

else

{

Client->Active=false;

Button5->Enabled=true;

Edit2->Enabled=true;

Button1->Caption="Подключится";

i=0;

}

}

else

{

if (i==0)

{

Server->Port=StrToInt (Edit2->Text); // порт

Server->Active=true;

Memo1->Lines->Add ("Сообщение: Сервер включен");

Button4->Enabled=false;

Edit2->Enabled=false;

Button1->Caption="Выкл сервер";

i=1;

}

else

{

Server->Active=false;

Memo1->Lines->Add ("Сообщение: Сервер выключен");

Button2->Enabled=false;

Button3->Enabled=false;

Button6->Enabled=false;

Button4->Enabled=true;

Edit2->Enabled=true;

Button1->Caption="Вкл сервер";

i=0;

}

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button2Click (TObject *Sender) // чат

{

if (Client->Active==true)

{

Client->Socket->SendText (Edit1->Text);

}

if (Server->Active==true)

{

Server->Socket->Connections [0] - >SendText (Edit1->Text);

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button3Click (TObject *Sender) // файл

{

void *P; // указатель на файл

int Size;

if (OpenDialog1->Execute ())

{

MS->LoadFromFile (OpenDialog1->FileName); // загружаем в поток файл

}

if (Server->Active==true)

{

Server->Socket->Connections [0] - >SendText ("file#"+OpenDialog1->FileName+"#"+IntToStr (MS->Size) +'#'); // имя файла для анализа

Memo1->Lines->Add ("\r\nОтправка файла клиенту");

MS->Position=0; // поток в начальную позицию

P=MS->Memory; // присваиваем указателю поток файла

Size=Server->Socket->Connections [0] - >SendBuf (P,MS->Size); // отправляем буффер

Memo1->Lines->Add ("Отправлено: "+IntToStr (Size) +" из "+IntToStr (MS->Size) +" байт");

}

if (Client->Active==true)

{

Client->Socket->SendText ("file#"+OpenDialog1->FileName+"#"+IntToStr (MS->Size) +'#'); // имя файла для анализа

Memo1->Lines->Add ("\r\nОтправка файла серверу");

MS->Position=0; // поток в начальную позицию

P=MS->Memory; // присваиваем указателю поток файла

Size=Client->Socket->SendBuf (P,MS->Size); // отправляем буффер

Memo1->Lines->Add ("Отправлено: "+IntToStr (Size) +" из "+IntToStr (MS->Size) +" байт");

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ClientRead (TObject *Sender,

TCustomWinSocket *Socket)

{

AnsiString Rtext; // текст который посылает сервер

Rtext=Client->Socket->ReceiveText ();

if (Receive==true) // если мы в режиме передачи файла

{

if (MS->Size<Size) // если мы еще принимаем файл и размер потока меньше размера файла

{

MS->Write (Rtext. c_str (),Rtext. Length ()); // записываем в поток

Form1->Memo1->Lines->Add ("Принимаем данные. ");

}

if (MS->Size==Size) // если файл принят и размер потока соответствует размеру файла

{

Receive=false;

MS->Position=0; // переводим поток в начало

Form1->Client->Socket->SendText ("end"); // отправка сообщения что файл принят

SaveDialog1->FileName=FileName;

if (SaveDialog1->Execute ())

{

MS->SaveToFile (SaveDialog1->FileName);

}

MS->Clear (); // очищаем поток

Size=0;

Form1->Memo1->Lines->Add ("Файл успешно принят\r\n");

}

}

else

{

if (Rtext. SubString (0,Rtext. Pos ("#") - 1) =="file") // Если это файл

{

Memo1->Lines->Add ("\r\nПрием файла от сервера");

Rtext. Delete (1,Rtext. Pos ("#")); // удаляем слово file

Name=Rtext. SubString (0,Rtext. Pos ("#") - 1); // Определяем имя файла

FileName=Name. SubString (Name. LastDelimiter ("\\") +1,Name. Length ()); // Выделяем чистое имя файла

Rtext. Delete (1,Rtext. Pos ("#")); // Удаляем последний разделитель

Size=StrToInt (Rtext. SubString (0,Rtext. Pos ("#") - 1)); // Определяем размер файла

Rtext. Delete (1, Rtext. Pos ("#")); // Удаляем последний разделитель

Memo1->Lines->Add ("Размер файла: "+IntToStr (Size) +" байт");

Memo1->Lines->Add ("Имя файла: "+FileName);

Receive=true;

}

else if (Rtext=="end") // команда приема файла

{

Memo1->Lines->Add ("Сервер успешно принял файл\r\n");

MS->Clear (); // очищаем поток

}

else if (Rtext=="clientoff") // удаленное выключение

{

Client->Active=false;

Memo1->Lines->Add ("Сообщение: Клиент выключен сервером");

Button5->Enabled=true;

Button1->Caption="Подключится";

i=0;

}

else

{

Memo1->Lines->Add ("Сообщение от сервера: "+Rtext);

}

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: ServerClientRead (TObject *Sender,

TCustomWinSocket *Socket)

{

AnsiString Rtext; // текст который посылает сервер

Rtext=Socket->ReceiveText ();

if (Receive==true) // если мы в режиме передачи файла

{

if (MS->Size<Size) // если мы еще принимаем файл и размер потока меньше размера файла

{

MS->Write (Rtext. c_str (),Rtext. Length ()); // записываем в поток

Form1->Memo1->Lines->Add ("Принимаем данные. ");

}

if (MS->Size==Size) // если файл принят и размер потока соответствует размеру файла

{

Receive=false;

MS->Position=0; // переводим поток в начало

Form1->Server->Socket->Connections [0] - >SendText ("end"); // отсылаем серверу что мы приняли файл

SaveDialog1->FileName=FileName;

if (SaveDialog1->Execute ())

{

MS->SaveToFile (SaveDialog1->FileName);

}

MS->Clear (); // очищаем поток

Size=0;

Form1->Memo1->Lines->Add ("Файл успешно принят\r\n");

}

}

else

{

if (Rtext. SubString (0,Rtext. Pos ("#") - 1) =="file") // Если это файл

{

Memo1->Lines->Add ("\r\nПрием файла от клиента");

Rtext. Delete (1,Rtext. Pos ("#")); // удаляем слово file

Name=Rtext. SubString (0,Rtext. Pos ("#") - 1); // Определяем имя файла

FileName=Name. SubString (Name. LastDelimiter ("\\") +1,Name. Length ()); // Выделяем чистое имя файла

Rtext. Delete (1,Rtext. Pos ("#")); // Удаляем последний разделитель

Size=StrToInt (Rtext. SubString (0,Rtext. Pos ("#") - 1)); // Определяем размер файла

Rtext. Delete (1, Rtext. Pos ("#")); // Удаляем последний разделитель

Memo1->Lines->Add ("Размер файла: "+IntToStr (Size) +" байт");

Memo1->Lines->Add ("Имя файла: "+FileName);

Receive=true; // Переводим сервер в режим приёма файла

}

else if (Rtext=="end") // команда приема файла

{

Memo1->Lines->Add ("Клиент успешно принял файл\r\n");

MS->Clear (); // очищаем поток

}

else if (Rtext=="serveroff") // удаленное выключение

{

Server->Active=false;

Memo1->Lines->Add ("Сообщение: Сервер выключен клиентом");

Button2->Enabled=false;

Button3->Enabled=false;

Button6->Enabled=false;

Button4->Enabled=true;

Edit2->Enabled=true;

Button1->Caption="Вкл сервер";

i=0;

}

else

{

Memo1->Lines->Add ("Сообщение от клиента: "+Rtext);

}

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button4Click (TObject *Sender) // выбор клиента

{

Label1->Caption=" Функции клиента";

Button1->Enabled=true;

Button4->Enabled=false;

Button5->Enabled=true;

Edit2->Enabled=true;

Server->Close ();

j=1;

Button1->Caption="Подключится";

Button6->Caption="Выкл сервер";

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button5Click (TObject *Sender) // выбор сервера

{

Label1->Caption=" Функции сервера";

Button1->Enabled=true;

Button4->Enabled=true;

Button5->Enabled=false;

Edit2->Enabled=true;

Client->Close ();

j=2;

Button1->Caption="Вкл сервер";

Button6->Caption="Выкл клиент";

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Edit1KeyDown (TObject *Sender, WORD &Key,

TShiftState Shift) // отправка сообщения shift+enter

{

if ( (GetKeyState (VK_RETURN) <0) && (GetKeyState (VK_LSHIFT) <0))

{

if (Client->Active==true)

{

Client->Socket->SendText (Edit1->Text);

}

if (Server->Active==true)

{

Server->Socket->Connections [0] - >SendText (Edit1->Text);

}

}

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button6Click (TObject *Sender) // удаленное выключение

{

if (Client->Active==true)

{

Client->Socket->SendText ("serveroff");

Memo1->Lines->Add ("Сообщение: Сервер выключен удаленно");

}

if (Server->Active==true)

{

Server->Socket->Connections [0] - >SendText ("clientoff");

Memo1->Lines->Add ("Сообщение: Клиент выключен удаленно");

}

}

// ---------------------------------------------------------------------------

приложение программирование компонент прикладной

Вывод:

В результате выполнения данной лабораторной работы, я овладел теоретическим материалом и практическими навыками по методам программирования обмена данными в сетях TCP/IP с использованием компонентов ServerSocket ClientSocket среды разработки C++ Builder в ОС Windows; изучил компоненты ServerSocket и ClientSocket используя справочную систему C++ Builder; самостоятельно реализовал прикладные функции изложенные в задании на работу.

Размещено на Allbest.ru


Подобные документы

  • C++ Builder - SDI-приложение, главное окно которого содержит настраиваемую инструментальную панель и палитру компонентов. Свойства атрибутов компонента, определяющие его внешний вид и поведение. События, методы и VCL компоненты в среде C++ Builder.

    курсовая работа [225,9 K], добавлен 12.02.2009

  • Реализация программного кода "Organizer 1.0". Разработка приложений баз данных с помощью Borland C++ Builder 6. Компоненты системы программирования для работы по технологии InterBase. Программный код и интерфейс "Organizer 1.0", структура приложения.

    курсовая работа [466,9 K], добавлен 28.07.2009

  • Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.

    курсовая работа [35,8 K], добавлен 11.06.2007

  • Среда разработки C++ Builder. Использование видимых и невидимых компонентов. Прототип обработчика событий. Менеджер проектов. Установка опций проекта. Создание приложений в С++ Builder. Создание простейшего приложения. Размещение компонентов на форме.

    курсовая работа [226,9 K], добавлен 24.03.2009

  • Визуальная разработка приложений баз данных. Характеристика визуальных компонентов среды разработки Builder 6.0, используемых в данном приложении. Программная реализация приложения, разработка форм и вкладок. Тестирование приложения, листинг программы.

    курсовая работа [3,1 M], добавлен 28.03.2011

  • Разработка компоненты C++ Builder, состоящей из двух окружностей, одна из которых движется по периметру другой. Создание установочного пакета и тестового приложения с использованием разработанного компонента. Инсталляция и проверка готовой компоненты.

    курсовая работа [591,5 K], добавлен 05.12.2010

  • Характеристика программных продуктов: MySQL, MSSQL, MSAccess. Разработка базы данных в среде C++Builder. Описание таблиц и установление связей между ними. Реализация функций просмотра, добавления, редактирования БД с применением языка запросов SQL.

    курсовая работа [393,0 K], добавлен 13.06.2015

  • Создание консольных приложений с использованием графического интерфейса пользователя. Содержание палитры компонентов программы С++ Builder. Использование возможностей объектно-ориентированного программирования, особенности редактора кода и форм в С++.

    лекция [27,0 K], добавлен 22.12.2010

  • Визуальное проектирование и событийное программирование. Повышение производительности программиста при использовании RAD-систем. Составление алгоритмов, разработка приложения для решения прикладных задач на примере консольных приложений C++ Builder 6.

    курсовая работа [258,7 K], добавлен 30.10.2013

  • Разработка приложения "Ведомость начисления заработной платы" в среде программирования C++Builder. Алгоритм и сценарий работы программы. Проектирование интерфейса пользователя. Написание программных модулей и результаты тестирования данной программы.

    курсовая работа [597,4 K], добавлен 31.01.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.