Клиент-Серверные приложения - приложения, где работа происходит между серверным центром и подключёнными к нему клиентами. Как пример можно привести всем известную 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;
Вот и всё, локальный чат написан. Проверим:
Всё работает. В следующей части рассмотрим большинство остальных событий, научимся отправлять файлы. Спасибо за внимание!