Подписаться на RSS рассылку
Главная » Статьи по Delphi » Интернет и сети » Создание простейшего чата

Создание простейшего чата

Автор: Валерий Ходоунский

В данной статье я расскажу, как написать простой чат структуры Head-to-Head, то есть соединение клиент-сервер с одним каналом связи.

Сперва создадим сервер. Создаём новый проект, Caption формы меняем на "Server". Добавляем на форму TSpinEdit (находится на вкладке "Samples", его лучше разместить где-нибудь вверху. Будет служить для указывания порта для коннекта клиента), TServerSocket (на вкладке "Internet", если этого компонента там не видно - выбираем Component -> Install packages, жмём кнопку Add и выбираем в диалоге в директории bin файл dclsockets70.bpl, и нажимаем Ok. Компоненты TClientSocket и TServerSocket должны появиться на вкладке "Internet"), TMemo (в нём будут отображаться сообщения, 2 TButton'а (один будет создавать сервер, другой - разрывать связь) и TEdit для отправки сообщений. Установите ServerType в StNonBlocking у TServerSocket'а.
Изменяем первому TButton'у Caption на "Активировать серв.". Пишем этой кнопке в обработчик OnClick:

procedure TForm1.Button1Click(Sender: TObject);
begin

  ServerSocket1.Port:=SpinEdit1.Value; // указываем порт
  ServerSocket1.Active:=True; // активируем наш сервер
end;

Обработчик OnClick для кнопки, разрывающей коннект:

procedure TForm1.Button2Click(Sender: TObject);
begin
  ServerSocket1.Active:=False; // деактивируем сервер
end;

Теперь пишем обработчик для TEdit'a OnKeyPress

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var S: string;
begin
  if Key = Chr(13) then // если нажали клавишу Enter...
  begin
    Key:=Chr(0);
    S:=Edit1.Text; // то в строковую переменную записываем текст из TEdit'à...
    Edit1.Clear; // очищаем поле
    ServerSocket1.Socket.Connections[0].SendText(S); // и отправляем текст
    Memo1.Lines.Add('< '+S);
  end;
end;

Отправку сообщений сделали, теперь нужно организовать их приём. Для этого пишем обработчик OnClientRead у TServerSocket'а.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; 
Socket: TCustomWinSocket);
var Received: string;
begin
  Received:=Socket.ReceiveText;
  Memo1.Lines.Add('> '+Received);
end;

Теперь создадим реакцию на отключение клиента

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; 
Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Клиент отсоединился');
end;

На этом закончим создание сервера. Сохраните проект и создайте новый.

Соотвественно новой форме изменяем Caption на "Клиент". Где-нибудь вверху формы разместим TEdit (будет для указания адреса сервера), TSpinEdit (будет указывать порт для подключения к серверу) и кнопку TButton, также как и для сервера, добавим TMemo и TEdit для отображения и отправки сообщений, и главный компонент - TClientSocket. Обработчик OnClick для кнопки, которая будет подключать:

procedure TForm1.Button1Click(Sender: TObject); 
begin
  ClientSocket1.Host:=Edit1.Text;
  ClientSocket1.Port:=SpinEdit1.Value;
  ClientSocket1.Open;
end;

Теперь пишем обработчик OnKeyPress для Edit2:

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); 
var Msg: string;
begin
  if Key = #13 then
  begin
    Key:=#0;
    Msg:=Edit2.Text;
    Edit2.Clear;
    with ClientSocket1.Socket do SendText(Msg);
    Memo1.Lines.Add('< '+Msg);
  end;
end;

Теперь организуем приём сообщений. Для этого пишем обработчик у ClientSocket-а OnRead:

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('> '+Socket.ReceiveText);
end;

Собственно наш простейший чат готов. Можете протестировать его с помощью обратной петли: создайте сервер, например, с портом 5000, запустите клиент, укажите ему в поле для адреса сервера localhost (либо 127.0.0.1), порт 5000 и подсоединитесь.

Просмотров: 12515

Обсудить на форуме

0   Спам
(05.11.2013)
4. Олег Stone (RobinStone)
Прекрасный, понятный материал. А ответ автора, на заявление о копипасте, - замечательный.
2 + 2 = 4
- фууу, это перепечатка материала, я это где-то уже видел!..
- да, действительно это уже где-то было (например в книжке по математике за 1-ый класс), однако это вовсе не значит, что это заявление
(2+2=4) - не верное, просто по другому, это писать сложнее
(1+1) + (1+1) = 1+1+1+1

0   Спам
(02.10.2009)
3. Vucnait
Автор ты вместо Memo написал RichEdit вот такая вродь должна быть шляпа:
Memo1.lines.add('> '+Received);
Ответ: Похоже на то! Спасибо! Изменено!

0   Спам
(29.08.2009)
2. Гость
with ClientSocket1.Socket do SendText(Msg); - написал блин можно было просто написать - ClientSocket1.Socket.SendText(Msg);
Ответ: Видемо автор посчитал, что ему так удобнее.

0   Спам
(29.08.2009)
1. Гость
Внизу сайта написано, что нельзя копировать статьи. Ага админ сам эту статью спёр, ибо я видел такую же только эта ваще малость переделана!!!
Ответ: Где ты такое вычитал, что нельзя копировать? Видемо плохо читать научили. "Перепечатка материалов разрешается...", главное чтобы автор был.
Я эту статью не писал, мне ее добавили пользователи, я как тебе проверю копипаст это или нет. На автора статьи посмотри!
Да и сам подумай как его по другому писать??? Код будет чемто похож


Имя *:
Email:


Код *:

Copyright © 2008-2016 Программирование на Delphi для начинающих и не только

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации

Хостинг от uCoz

Автор проекта: Борисов Сергей

e-mail: save-x@yandex.ru

Связь с администрацией сайта