Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TClientSocket & TServerSocket

Автор: Макагон Сергей
http://devoid.com.ua/

В 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 разобрались , а кого заинтересовала тема чата, заходите в раздел "Мои программы" И качайте доделанную мной, с большим колличеством настроек программу вместе с исходниками.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
98K
27 февраля 2017 года
muk07
0 / / 27.02.2017
+4 / -0
Мне нравитсяМне не нравится
27 февраля 2017, 13:06:09
Ужасно. У автора проблемы как с русским языком, так и с программированием.
2.
88K
24 марта 2016 года
Marvin Matters
3 / / 24.03.2016
Мне нравитсяМне не нравится
24 марта 2016, 08:39:09
Вроде все ошибки пофиксил, но вылетает ошибка list out of bounds (0) на строке
ServerSocket1->Socket->Connections[0]-> SendText(Edit2->Text+"::"+Edit1->Text);
Может кто-то подскажет в чем ошибка?
3.
46K
10 декабря 2008 года
acron
0 / / 10.12.2008
Мне нравитсяМне не нравится
7 июля 2010, 11:42:14
Ифо позитив! Но как было замечено, ошибок много.... По исходнику у меня при отсылке сообщения ошибку выдавало и когда нажимал "Откл" все равно отсылало сообщения.....!
Но все же, автору спасибо!
4.
41K
22 июня 2008 года
stan777
0 / / 22.06.2008
+1 / -0
Мне нравитсяМне не нравится
9 июня 2009, 18:25:51
Попытался создать проект по этому примеру,но почему-то он не заработал(((
5.
36K
23 января 2008 года
mYziK
0 / / 23.01.2008
Мне нравитсяМне не нравится
23 января 2008, 02:10:27
Ребята, раньше не работал с сокетами вообще, подскажите, почему вышеприведенный код может неработать? Фаервол отрубил, тестил на одном компе (через 127.0.0.1), сервер вроде создает - а клиент не коннектится и ничего не говорит... И еще вопрос, разве при коннекте и создании сервера ненужно указывать порт подключения? Свойство ClientSocket1->Port и ServerSocket1->Port
6.
27K
22 февраля 2007 года
Jacinto
0 / / 22.02.2007
+0 / -1
Мне нравитсяМне не нравится
22 февраля 2007, 18:02:27
Спасибо большое, Сергей.
Очень хорошая статья. Мне, как человеку, который ни разу не писал подобные приложения и не работал в среде Builder, было очень легко разобраться. А ошибки - это чтобы избавиться от бездумного копирования. Не так ли? :)
7.
23K
04 ноября 2006 года
Log1c
4 / / 04.11.2006
+2 / -0
Мне нравитсяМне не нравится
6 ноября 2006, 22:22:07
Автору 4+.
С помощью 2 элементов чат - это самое простое решение и это супер.
Что касается ошибок, то в принципе они понятны и лёгко устранимы.
Хотя при первой проверке их можно и не заметить. Кстати не понимаю зечем их надо было делать(ведь явно в начале был скопирован код а потом добавлены исправления).

Кнопка соединится.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClientSocket1-> Host=Edit3->Text;
ClientSocket1-> Address=Edit3->Text;
ClientSocket1-> Active = true;
}

P.S. Зачем в статью для начинающих вставлять кучу "мусора":
обработку исключительных ситуаций и какую кнопку делать доступной/ недоступной. И тем более повторяющийся код писать не стоило. Можно и запутатся.
8.
Аноним
Мне нравитсяМне не нравится
13 декабря 2005, 14:56:46
Автору респект, очень наглядно
9.
Аноним
Мне нравитсяМне не нравится
19 апреля 2005, 16:48:58
Да, про ошибки это точно замечено!!!
10.
Аноним
+1 / -0
Мне нравитсяМне не нравится
26 декабря 2004, 22:40:59
Инфа прикольная, все понятно и доступно. Но нельзя ж столько ошибок делать!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог