Статья: TClientSocket & TServerSocket

TClientSocket & TServerSocket

Макагон Сергей

В C++Builder 6 для передачи какой-либо информации по сети удобнее всего использовать компоненты закладки Internet: TClientSocket и TServerSocket.

Чтобы лучше разобраться в работе этих компонентов я предлагаю написать простенький сетевой чат, на примере которого можно будет легко увидеть компоненты в действии.

Для начала создадим новый проект(File->New->Application), поместим на форму компоненты:

TClientSocket и TServerSocket, чтобы наша программа могла быть и клиентом и сервером (не одновременно конечно ;) ).

Далее разместим компонент TMemo (закладка Standart) — в нем как вы догадались будет отображаться текст чата.

Следующим на форму нужно кинуть компонент TEdit (Standart) — в него мы будем писать текcт, который нужно отправить собеседнику.

Ну и конечно тяжело обойтись без кнопки отправить — кидаем на форму TButton. Кроме того что уже есть на форме, нам еще понадобится три кнопки и два эдита (TEdit) (их назначение описывается по ходу обращения к ним).

Итак, наформе:

ClientSocket1 и ServerSocket1

Memo1

Edit1,Edit2,Edit3

Button1,Button2,Button3,Button4

Теперь изменяем свойства:

Button1->Caption на «Отправить»

Button2->Caption на «Создать»

Button3->Caption на «Соединиться» и

Button4->Caption на «Отключить».

Убираем текст во всех Эдитах. Свойство Memo1->ReadOnly = true,

ClientSocket1->Host — нужно написать IP-адрес сервера к которому вы будете присоеденяться

(IP-адресс устанавливается в настройках соединения Windows), если прописать 127.0.0.1, то вы будете конектиться к себе на компьютер (так удобно делать, когда проверяешь на работоспособность свою программу. Запустив ее дважды, одна клиент с 127.0.0.1, а другая сервер !) если же вы коннектитесь к другу, то заранее договоритесь какой будет Ай-Пи-адрес (143.0.0.5 — например). Но для того чтобы Ай-Пи -адресс можно было легко сменить, мы и положили на форму один из Эдитов, его текст при коннекте и будет отвечать свойству ClientSocket1->Host и ClientSocket1->Address.

В свойстве ClientSocket1->Port и ServertSocket1->Port — должны стоять одинаковые значения, чтобы Сервер и Клиент прослушивали и работали на один порт. Число можно выбрать любое (1024 например).

Кнопку «Отключиться» изначально нужно сделать недоступной(Enabled = false)так как вначале отсоеденяться нам нет от кого.

Дальше опишем обработчики событий для кнопок «Создать», «Соединиться», «Отключить».

Кнопка «Создать» — активизирует сервер. Он начинает прослушивать порт на коннект со стороны клиента.

void __fastcall TForm1::Button2Click(TObject *Sender)

{

ServerSocket1->Active = true ;

// Делаем недоступную «Соединиться» (так как мы уже сервер)

Button3->Enabled = false

// Делаем доступную «Отключиться» (понятно зачем)

Button4->Enabled = true

Memo1->Lines->Add(«Серверсоздан») ;

}

Так наша программа стала сервером!

Давайте опишем клиента!(Кнопка «Соединиться»)

В Edit3->Text впишите 127.0.0.1 — предполагается что тестироваться будет на одном компьютере (что б других не заморачивать:)

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Edit3->Text = ClientSocket1->Host // ПрисваиваемКлиентуАй-ПиизЭдита

Edit3->Text = ClientSocket1->Address

ServerSocket1->Active = true ;

// Делаем недоступную «Создать» (так как мы коннектимся)

Button2->Enabled = false

// Делаем доступную «Отключиться» (понятно зачем)

Button4->Enabled = true

}

Вот Вы и написали тот минимум который надо для освоения компонентов!

Но кто хочет останавливаться? А чат доделать! Правильно пишем дальше:

Дальше будем описывать свойства компонентов Клиента и Сервера OnConnect (когда присоединился).

void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add(«Клиентприсоединился»);

}

Это когда вы сервер и к Вам присоединились, на Мемо появится надпись!

Для клиента почти так само:

void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add(«Выприсоединены»);

}

Понятно, да? Отлично, дальше остается только рассказать Вам зачем Edit2 на форме и описать кнопку «Отправить».

Итак, Эдит2 нам нужен для Вашего ника! Ведь какой чат без ника!

Теперь самое главное — описание кнопки «Отправить:

if(Edit2->Text == „“)

ShowMessage(»ВведитеВашник !");

return ;

}

if(Edit1->Text == "")

{

ShowMessage(«Введите текст который надо отправить»);

return ;

}

//Это была обработка исключительных ситуаций, типа пустых строк ввода ;

Memo1->Lines->Add(Edit2->Text+":: "+ Edit1->Text) ;

if (ServerSocket1->Active == true) {

ServerSocket1->Socket->Connections[0]->

SendText(Edit2->Text+"::"+Edit1->Text); }

else

{ ClientSocket1->Socket->SendText(Edit2->Text+"::"+Edit1->Text);}

Edit1->Text = "" ;

}

Теперь разберемся с этой кучей кода:

//добавляем свое сообщение себе в Мемо

Memo1->Lines->Add(Edit2->Text+":: "+ Edit1->Text) ;

if (ServerSocket1->Active == true){ServerSocket1->Socket->

Connections[0]->SendText(Edit2->Text+"::"+Edit1->Text)};

Если мы сервер, то посылаем нашу строку первому в списке клиенту ( чат розщитан на двоих ), иначе:

else {

ClientSocket1->Socket->SendText(Edit2->Text+"::"+Edit1->Text);

}

Посылаем строку серверу!

Независимо от того кто мы (клиент-сервер)

Очищаем Эдит1:

Edit1->Text = "";

Также надо описать прием информации и занесение ее в Мемо1. Делается это обработчиком события OnRead у TClientSocket и TserverSocket:

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add(Socket->ReceiveText()) ;

}

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,

TCustomWinSocket *Socket)

{

Memo1->Lines->Add(Socket->ReceiveText()) ;

}

Вот вроди бы и все. С TClientSocket и TserverSocket разобрались, а кого заинтересовала тема чата, заходите в раздел «Мои программы» И качайте доделанную мной, с большим колличеством настроек программу вместе с исходниками.

еще рефераты
Еще работы по информатике, программированию