Разработка чата с использованием сокетов в Delphi

Данная тема посвящена программированию под сеть на языке Delphi. В теме приведен простой пример передачи сообщений по сети с использованием сокетов в Delphi.

Сокеты(англ. socket — гнездо, разъём) — название программного интерфейса для обеспечения обмена данными между процессами.

В начале разработки скажу, что в данной статье будут использованы другие компоненты такие как TStatusBar, TIniFile и др. работа с объектами помимо TSocketClient и TSocketServer рассматриваться не будет.

Приложение работает по схеме клиент-сервер, т.е. будет отдельно разработана серверная часть приложения и клиентская. Две части приложения формируют одно – локальный чат. Для того чтобы привести простой пример использования сокетов в этой статье будет рассмотрина реализация локального чата на языке Delphi, который предназначен для передачи сообщений по локальной сети…

В процессе разработки созданы два приложения, одно из которых является сервером. Через серверное приложение будет происходить связь между клиентами чата.

Разработка интерфейса

Интерфейс приложения клиента и сервера будут практически одинаковы. На рис. 1 приведен пример интерфейса серверного приложения. При разработки интерфейса использовались такие компоненты как TButton, TMainMenu, TMemo, TSrarusBar.

Главное меню содержит следующие выпадающие пункты меню:

Рис. 1 «Интерфейс программы (сервер)»

Рис. 1 «Интерфейс программы (сервер)»

  • Меню «Сеть» — служит для соединения клиентов с сервером.
  • Меню «Настройка» пункт «Параметры» — имеет две вкладки «Сеть» и «Звук» (Рис. 2).

param

Рис. 2 «Настройка локального чата (Сеть)»

Параметры программы будут сохранены в файл settings.ini. При передачи сообщения клиентом, необходимо указать в настройках порт и ip адрес через который следует подключаться к приложению-серверу.
Для создания соединения и передачи сообщений между клиентами и сервером, необходимо использовать два компонента Delphi TSocketClient (для клиента) и TSocketServer (для сервера).
Соеденение с сервером
Соединение с сервером осуществляется следующим образом, в компоненте TSocketServer существует свойство Active, которое служит для ожидания подключения.

procedure TForm1.N2Click(Sender: TObject);
begin
 ServerSocket1.Port:=ClientPort;
 ServerSocket1.Active:=True;
 StatusBar1.Panels[0].Text:='Прослушивание...';
end;

Подключение клиента осуществляется с помощью команды меню «Сеть» → «Подключиться». У компонента TSocketClient имеется свойство Port, где необходимо указать порт сервера, через который будет осуществляться соединение с ним.
В процедуре, которая продемонстрирывана ниже, выполняется проверка IP-адреса, значение которого берется с файла настроек. Так же выполняется проверка на существующее соединение, т.е. если приложение было завершено не корректно и снова запущено, то приложение (клиент) осуществляет проверку на существование соединения, если соединение установлено, то программа переподключается к серверу. Для соединения с сервером необходимо свойству СlientSocket1.Active присвоить значение True.

procedure TForm2.N2Click(Sender: TObject);
begin
СlientSocket1.Port:=ClientPort;
if СlientSocket1.Active then ClientSocket1.Active:=False;
if Length(ClientIp)>0 then
with ClientSocket1 do
begin
…
Host:=ClientIp;
Active:=True;
end;
end;

Host – переменной присваивается IP адрес содержащийся в фале settings.ini. При удачном подключении строке состояния выведется сообщение «Подключен: <Имя компьютера-сервера>», а иначе в поле получения сообщения выведется сообщения об ошибки подключения к серверу (Рис. 3).

chat_err

Рис. 3 «Ошибка соединения с сервером»

Передача/прием сообщений
Передача сообщений выполняется с применением метода компонента SendText компонента TSocketClient(TSocketServer в зависимости от типа программы).

procedure TForm1.Button1Click(Sender: TObject);
begin
if  ServerSocket1.Active = True then
begin
ServerSocket1.Socket.Connections[0].SendText(ClientName+': ' +Memo1.Lines[Memo1.Lines.Count - 1]);
Memo2.lines.Add(ClientName+': ' + Memo1.Lines[Memo1.Lines.Count - 1]);
Memo1.Clear();
end
else
ShowMessage('Сеть не прослушивается!');
end;

Сообщение отображается в следующем формате: <Имя пользователя>: <текст сообщения>. Основным недостатком передачи сообщений таким методом является то что передается сообщение размером 255 символов.

Прием сообщений осуществляется с использованием метода ReceiveText, компонента Socket.

procedure TForm2.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;

При приеме сообщение выводится в компонент Memo.

P.S. В данной статье подразумевается, что читающий уже знаком с основными компонентами среды Delphi. Просьба перед запуском программы убедиться в правильной настройке программы. Для настройки необходимо указать в поле порт (Настройка — Параметры) указать одинаковый порт, через который будет выполнятся передача данных. На стороне клиента в «Параметрах» необходимо задать IP-адрес компьютера, на котором установлена серверная часть программы.