Чат для локалки собственными руками

Xakep, номер #038, стр. 038-061-2


Разомни пальцы, мышку, клаву и запусти Delphi. Сейчас мы приступим к моему любимому занятию.... Да нет, не к сексу. Я его тоже люблю, но сегодня мы займемся кодингом, а секс оставим на ночь :).

На форме мне понадобятся:

1. Компонент TMemo. Его можно растянуть почти по всей форме.

2. Компонент TEdit, в который мы будем писать отправляемое сообщение.

3. Кнопка TButton, по нажатию которой сообщение будет отсылаться.

На рисунке 2 показана форма моего будущего чата.

Для работы с портами нам нужны компоненты idUDPClient с закладки "Indy Clients" и idUDPServer с закладки "Indy Servers". Брось по одному такому компоненту на форму.

Теперь нужно настроить протокол UDP. Первое что сделаем - выберем любой порт от 1 до 65 тысяч, через который будет происходить связь. Я решил выбрать 11245 (ты можешь выбрать любое другое). Установи это значение у свойства Port компонента idUDPClient и у свойства DefaultPort компонента idUDPServer. Это заставит клиента и сервера работать на одном и том же порту, а значит может осуществиться связь.

ЗАПОМНИ!!! Порты протокола UDP не пересекаются с портами TCP. Это значит, что TCP порт 80 не равен UDP порту 80.

Теперь у клиента (idUDPClient) нужно указать свойство Host. Сюда записывается IP адрес компа, которому будут отправляться сообщения. Но у нас чат и сообщения должны получать все пользователи в сетке, запустившие прогу. Поэтому, чтобы не было проблем, желательно установить у обоих компонентов свойство BroadcastEnabled в true. А вместо конкретного IP адреса использовать широковещательный (такой адрес, который получают все). Если у тебя в сетке используются адреса типа 192.168.100.х, то для тебя широковещательный адрес будет 192.168.100.255 (последний октет меняем на 255).

Приготовления окончены, можно кодить.

ШКОДИНГ

Создай обработчик события OnClick для кнопки и напиши там следующий код:

procedure TForm1.Button1Click(Sender: TObject);

begin

IdUDPClient1.Send(Edit1.Text);

end;

Здесь всего одна строчка, которая отправляет с помощью UDP клиента содержимое строки ввода (компонента Edit1).

Теперь нужно научить UDP сервер получать эту инфу. Для этого создай обработчик события OnUDPRead для компонента IdUDPServer. В нем напиши содержимое листинга 1, а я попытаюсь доходчиво описать происходящее.

У процедуры-обработчика события есть три параметра. Первый присутствует во всех обработчиках и ничего интересного для нас сегодня в себе не несет. Второй - это данные, которые получены из сети. Третий - тут хранится информация о том, откуда пришли данные.

Итак, полученные данные хранятся во втором параметре. Они приходят к нам как простой неформатированный поток TStream. Чтобы удобней было работать с данными, их лучше перегнать в строковый поток TStringStream. Ты думаешь, это неудобно? Неудобно на потолке сексом заниматься, одеяло падает. А также когда соседские дети на тебя похожи. А тут все удобно. А вдруг ты передаешь не текст, а картинку, и компонент форматнет ее в текст? Вот это уже будет не неудобно, а полный облом.

Назад на стр. 038-061-1  Содержание  Вперед на стр. 038-061-3