|

Чат для локалки собственными руками
Xakep, номер #038, стр. 038-061-3
Смотри, как легко все превращается в текст. В обработчике я объявил одну переменную StringFormatedStream типа TStringStream (строковый поток). Первой строкой кода я его инициализирую. Во второй строчке я копирую в строковый поток данные из простого неформатированного потока. Все!!! Теперь переданный мне текст находится в свойстве DataString строкового потока StringFormatedStream. Я смело могу выводить этот результат в компонент Memo.
Но мы же пишем чат, и желательно еще и выводить информацию о том, кто сказал этот текст. Для примера я вывожу IP адрес отправителя данных, который находится в свойстве PeerIP третьего параметра ABinding. Но это только для примера и в реальной ситуации это некрасиво. Поэтому ты можешь добавлять имя отправителя сразу в текст отправки. Это значит, что по нажатию кнопки отправки сообщения нужно изменить код следующим образом:
IdUDPClient1.Send('Сюда помести имя отправителя'+
Edit1.Text);
Можно дать возможность юзверю вводить имя в отдельной строке ввода Edit2. В этом случае код будет таким:
IdUDPClient1.Send(Edit2.Text+' '+Edit1.Text);
Все!!! Кодинг окончен.
COMPLETE!
Если у тебя все получилось, то можешь запустить прогу и пообщаться с самим собой. Ну а если благодаря Х ты уже осетенил свой дом, район, город (нужное подчеркнуть), то устанавливай свой чат всех сетянам и общайся. Чат простой, но очень быстрый и абсолютно не нагружает систему, в отличие от чатов на основе TCP.
Если у тебя возникли проблемы с компиляцией, то Delphi (как и у меня) забыл добавить к проекту модуль idSocketHandle. Допиши его в раздел uses, и проблемы уйдут.
Дополнительную инфу, как всегда, можно найти на моем сайте www.cydsoft.com/vr-online. Там же можно найти и исходники чата, написанные мной.
ЛИСТИНГ 1
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData:
TStream; ABinding: TIdSocketHandle);
var
StringFormatedStream: TStringStream;
s: String;
begin
//Инициализация
StringFormatedStream := TStringStream.Create('');
//Копирование из простого потока в строковый.
StringFormatedStream.CopyFrom(AData, AData.Size);
//Вывод полученного сообщения
Memo1.Lines.Add(ABinding.PeerIP+' '+StringFormatedStream.DataString);
//Перенаправление сообщения дальше
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
//Освобождение строкового потока.
StringFormatedStream.Free;
end;
Назад на стр. 038-061-2 Содержание
|