Вторник, 2019-06-25, 2:48 PM
Главная страница | Регистрация | Вход Приветствую Вас заблудившийся пакет | RSS
Меню сайта

Категории каталога
Программирование [58]
.. все с этим делом связаное..
Нейронные сети [4]
Нейронные сети, использование алгоритмы роботы
HACK [5]
Здесь материалы находятся лишь для ознакомления и НЕ БОЛЬШЕ!!!! Автор не несет отвественности за использование материалов даной категории
OC [6]
Unix, FreeBSD, Windows, Linux Описание, совети, секреты, настройки
WEB [25]
web-programming и все с этим связаное
Сети [2]
Описание сетей, сетевых технологий, настройки и некоторые секреты
Мабила [9]
Описание мобильных технологий, программинг под мабилу, и просто интересные моменты
Разное [10]
то что не вошло в другие категории.. прикольные истории про программеров и деятелей информационной индустрии
История [6]
История этого компьтерного мира и некоторых ее учасников
FREE [3]
free on the web..

Наш опрос
Оцените мой сайт

Результаты · Архив опросов

Всего ответов: 129

Начало » Статьи » Программирование

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

Статью написал Макагон Сергей для сайта C++Builder

Категория: Программирование | Добавил: Сэнсэй (2006-08-28)
Просмотров: 731 | Рейтинг: 0.0

Всего комментариев: 0
Имя *:
Email *:
Код *:

Украинская Баннерная Сеть
Поиск по каталогу

Кнопки друзей

Статистика
Рейтинг сайтов Powered by MyPagerank.Net

Copyright DEBUGGER © 2007 Используются технологии uCoz