Создание многопользовательских приложений на базе сокетов. Чат.

Новая страница 1 Создание многопользовательских приложений на базе сокетов

Создание многопользовательских приложений на базе сокетов.

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

Работая в сети Internet, мы очень часто встречаемся с разного рода многопользовательскими программами. Ими могут быть почтовые клиенты, чаты, форумы, FTP клиенты и т.п. Все эти приложения используют для своей работы разного рода протокола: FTP, POP, SMTP, HTTP, и т.д. Но базовым для них является единый протокол - TCP/IP.

Типичное же приложение TCP/IP построено на клиент-серверной архитектуре. Примером приложения построенного на данной архитектуре, является чат реального времени. В этой статье мы попытаемся создать чат средствами Borland Delphi. Для этой цели нам необходимы компоненты TClientSocket и TServerSocket (рис. 1). Выбранные нами компоненты при работе с протоколом TCP/IP используют интерфейс сокетов. Но прежде чем перейти к разработке чата, разберем, что же такое сокеты.

(Рис. 1) Расположение компонентов TClienSocket и TServerSocket

Сокеты – это интерфейс прикладного программирования для сетевых приложений TCP/IP. Интерфейс сокетов был создан в восьмидесятых годах для операционной системы UNIX. Позднее интерфейс сокетов был перенесен в Microsoft Windows. Сокеты до сих пор используются в приложениях для сетей TCP/IP. В переводе с английского "sockets" – гнезда, т.е. сетевые приложения используют сокеты, как виртуальные разъемы для обмена данными между собой. Сокеты бывают трех видов: клиентские, слушающие и серверные.

Клиентские сокеты устанавливают связь с сервером и обмениваются с ним данными. Клиентский сокет включен в компонент TClientSocket. Слушающий сокет принимает запрос на соединение от клиентского сокета, и соединяет сервер с клиентом. Слушающий сокет содержится в компоненте TServerSocket. Серверный сокет обменивается данными с клиентом по уже установленному (слушающим сокетом) соединению.

Теперь вернемся к компонентам TClientSocket и TServerSocket. Для того чтобы клиент мог установить соединение с сервером, ему необходимо указать его адрес (IP) и номер порта, через который будет происходить обмен данными.

Перейдем к примеру. У нас будет два приложения: сервер и клиент. Чат будет работать по принципу - один сервер и множество клиентов. Клиент будет посылать сообщение на сервер, а сервер будет рассылать это сообщение другим клиентам, т.е. клиенты будут обмениваться сообщения между собой через сервер. Для написания чата, мы создадим два проекта: сервер и клиент.

Создание сервера

Создайте форму и добавьте на нее компоненты, показаные на рис.2.

(Рис 2) Сервер

В процедуре FormCreate задается значение порта, через который будет происходить обмен данными. Затем TServerSocket начинает свою работу. В обработчике кнопки «Выход» происходит отключение сервера. При завершении работы программы, очень важно отключать TServerSocket и закрывать соединение. Далее в обработчике события OnClienRead, компонента TServerSocket происходит обработка данных полученных от клиента. Событие OnClienRead генерируется при получении данных от клиента. Это все, что нужно учитывать при разработке клиента. Откомпилируйте созданное нами приложение.

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Port := 777; {Указываем порт, который будет слушать сервер}
ServerSocket1.Active := True; {Активизируем сервер}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Active := False; {Выключаем сервер}
ServerSocket1.Close; {Закрываем соединение}
Close; {Завершаем программу}
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
S: String;
I: Integer;
begin
{Добавляем к строке сообщения клиента идентификатор его сокета}
S := InTtoStr(Socket.SocketHandle) + '>' + Socket.ReceiveText;
ListBox1.Items.Add(S); {Добавляем сообщение в список}
{Перебираем все установленные соединения}
For i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
{Проверяем - если идентификатор очередного сокета не совпадает
с идентификатором сокета, приславшего сообщение, то...}
if ServerSocket1.Socket.Connections[i].SocketHandle <> Socket.SocketHandle then
{... посылаем очередной клиентской программе новое сообщение}
ServerSocket1.Socket.Connections[i].SendText(S);
end;

Создание клиента

Создайте форму и добавьте на нее компоненты, показанные на рисунке 3.

(Рис. 3) Клиент

Из листинга видно, что при нажатии на кнопку «Подключение» заполняются свойства адрес и порт, компонента TClientSocket. Затем происходит подключение. В процедуре ClientSocket1Read сообщение, полученное от сервера, добавляется в ListBox1. И самое главное – это обработчик кнопки «Послать сообщение». В этой процедуре сообщение проверяется и отправляется на сервер. При этом вызывается метод ClientSocket1.Socket.SendText. Остальные процедуры очень просты. Клиент готов к работе. Откомпилируйте его.

procedure TForm1.Button1Click(Sender: TObject);
{
Подключение к серверу
}
begin
ClientSocket1.Address := Edit2.Text; {Адрес сервера}
ClientSocket1.Port := StrToInt(Edit3.text); {Порт сервера}

ClientSocket1.Active := True; {..включаем его}
end;


procedure TForm1.FormDestroy(Sender: TObject);
{
Закрытие программы
}
begin
ClientSocket1.Active := False; {Выключаем клиента}
ClientSocket1.Close; {Закрываем сокет}
Close; {Закрываем программу}
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
{
Обработка данных от сервера
}
begin
{Добавляем новое сообщение от сервера в список}
Listbox1.Items.Add(Socket.ReceiveText);
end;


procedure TForm1.Button2Click(Sender: TObject);
{
Послать сообщение
}
begin
{Если сообщение не пусто, то...}
If Edit1.Text <> '' then
ClientSocket1.Socket.SendText(Edit1.text); {..посылаем его на сервер}
Edit1.Text := ''; {Очищаем поле ввода}
end;

Теперь, когда и сервер и клиент готовы, запустите сервер. Затем запустите несколько экземпляров клиента, введите в каждом номер порта и IP-адрес. После этого нажмите на каждом клиенте кнопку «Подключение». Теперь клиенты могут обмениваться между собой сообщениями.

Как видите, все не так уж и сложно. Используя мои предыдущие статьи, Вы сможете расширить функциональность созданного нами чата и добавить в него функции обмена файлами. Я надеюсь, что эта статья помогла Вам познакомиться с сокетами и принципами их работы.

 

Автор статьи: Волков Михаил (независимый специалист

по сетевому программированию)



Опубликовал admin
25 Июл, Пятница 2003г.



Программирование для чайников.