Реализация приложения по двунаправленному обмену текстовой и двоичной (бинарной) информацией
Методы программирования обмена данными в сетях 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