Клиент-Серверные приложения в Delphi[1]. Чат



Клиент-Серверные приложения - приложения, где работа происходит между серверным центром и подключёнными к нему клиентами. Как пример можно привести всем известную ICQ или Skype. В Делфи существует огромное количество компонентов для построения клиент-серверной сети. Сегодня рассмотрим 2 самых популярных - ServerSocket и ClientSocket.

Ещё в 7-ой версии Delphi были попытки выкинуть с палитры компонентов такие объекты, как ServerSocket и ClientSocket. Но оставили idTCPClient и idTCPServer... Если честно, по мне, работа с ними - крайне не удобна. Так что сегодня мы добавим себе на палитру старые-добрые *'Socket и поработаем с ними, а точнее - напишем чат для локальной сети.

Первым делом вернём их на палитру, в Delphi XE5 это делается так:

1) Component -> Install Packages..



2) Add -> Вбиваем в поле "Имя файла" файл dclsocketsXXX.bpl, где XXX - версия компонента. В моём случае - 190. Путь до файла (мало-ли) выглядит примерно так: "C:\Program Files\Embarcadero\RAD Studio\12.0\bin\dclsockets190.bpl"

Перезагружаем Delphi, открываем и видим:



Эти родные компоненты :)

Теперь создаём 2 формы, Server-Client соответсвтенно, на первую кидаем 1 edit, 1 memo, 2 button, 1 ServerSocket. На вторую всё тоже, но уже ClientSocket:



Сначала рассмотрим ServerSocket. Мы будем использовать 2 основных события этого компонента:

1) OnClientConnect - событие, позволяющее отслеживать подключившихся клиентов. При подключении нового клиента в переменную Socket, а конкретнее в свойство переменной RemoteAddress ляжет IP-адресс клиента. Таким образом можно заносить в log-журнал всех подключившихся клиентов. Вообще почти всё, что поступает от клиента, хранится в разных свойствах переменной Socket.

2)OnClientRead - событие, читающее в настоящем времени все сообщение, которые посланы клиентом серверу.

Код кнопки "Active":

begin
form1.ss1.Port:= 7777; //Устанавливаем PORT для подключения
form1.ss1.Active:= true; // Активируем сервер
form2.Show; // Вызываем клиента
end;


Код события OnClientRead:

begin
form1.mm.Lines.Add(' Петя: ' + socket.ReceiveText); // Выводим в mm (memo) сообщение от "Пети" :) 
end;


Где функция ReceiveText у поля socket хранит сообщения, отосланные клиентом.

Код события OnClientConnect:

begin
mm.Lines.Add('    Подключён новый клиент: ' + Socket.RemoteAddress);
end;


Где функция RemoteAddress у поля Socket хранит IP-адресс только что подключившегося клиента.

Теперь код кнопки "Send Message":

begin
ss1.Socket.Connections[0].SendText(edit1.Text);
end;


Рассмотрим строку, что выше. Connections - это поле, которое содержит лист клиентов. Начинается с 0. SendText - функция, которая отсылает сообщение i-ому клиенту.

С сервером разобрались. Теперь клиент. Код кнопки "Подключение":

begin
form2.cs1.Host:='127.0.0.1'; // Устанавливаем host для подключения
form2.cs1.Port:= 7777; // устанавливаем port, тот же, что и у сервера (что логично)
form2.cs1.Open; // открываем клиента, тем самым подключая к серверу. 
 
end;


У клиента в этом примере используется 1 событие - OnRead. Оно аналогично OnClientRead у сервера - читает поступившую информацию. Код события:

begin
form2.mm.Lines.Add(' Вася: '+ cs1.Socket.ReceiveText);
end;


Всё почти так же, как и у сервера. Теперь код кнопки Send Message:

begin
cs1.Socket.SendText(edit1.Text);
end;


Вот и всё, локальный чат написан. Проверим:



Всё работает. В следующей части рассмотрим большинство остальных событий, научимся отправлять файлы. Спасибо за внимание!
Теги:
Delphi, файла, палитру, выглядит, примерно, Program, Files, случае, версия, Packages, Install, Вбиваем, dclsocketsXXX, Embarcadero, компонента, dclsockets190, формы, создаём, Server, Client
Добавлено: 24 Февраля 2015 21:58:17 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...