Пишем мини-чат
Пишем мини-чат с клиентом и сервером ( сервер в понимании программа). Писать будем, используя Indy...Бросаем на форму IdUDPClient (Indy Clients), IdUDPServer (Indy Servers), два текстовых поля (одно для IP, а второе именно для сообщения) и также один Memo (в него вписываться будем принятые данные).
Чат складывается только из одной программы (она одновременно выполняет роль клиента и сервера).
Названия компонентов:
Edit1 - это есть текстовое поле для ввода IP.
Edit2 - является текстовым полем, которое содержит отсылаемое сообщение.
Memo1 - многостроковое поле, содержащее полученные сообщения.
Button1 - это кнопка для отправки сообщения.
А вот и сам код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, StdCtrls, IdSocketHandle;
type
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
IdUDPClient1.Port:=1123; //Порт клиента
IdUDPServer1.DefaultPort:=1123; //Порт сервера
IdUDPServer1.Active:=True; //Активируем сам сервер
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPClient1.Host:=Edit1.Text; //IP, которому отсылаем сообщение
IdUDPClient1.Send(Edit2.Text); //Отсылаем сообщение
end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
mydata: TStringStream;
begin
mydata:=TStringStream.Create(''); //Создаем текстовый поток, который будет содержать в себе принятые данные
mydata.CopyFrom(AData, AData.Size); //Копируем у наш поток принятые данные
Memo1.Lines.Add(mydata.DataString); //Добавляем данные с потока в Memo1
mydata.Free; //Освобождаем поток
end;
end.
Чтобы проверить программу на 127.0.0.1 достаточно одной программы, ведь она выполняет роль одновременно и клиента и сервера. Вписывает в IP 127.0.0.1, в другом же поле мы пишемь сообщение и нажимаемь на кнопку отправки. Данные в данном случае должны занестись в Мемо1.
Протестируем... Скинем чат кому то чтобы он его запустил. Потом запускаем уже мы, указываем его IP и пишем текст собеседнику. После чего даем ему собственный IP, чтоб он написал нам.
Я вам представил самый простой вариант, без запутывания различными командами. При желании можно доделать то что нужно, к примеру, чтобы писало от кого получаем сообщение; сделать ники в чате или адресную книгу IP и т.д.
П.С. В случае если выбивает ошибка - [Error] Unit1.pas(22): Undeclared identifier: 'TIdSocketHandle' і показує на процедуру procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle); Нужно всего-навсего вручную прописать модуль IdSocketHandle в разделе Uses. Потому что он просто не прописывается автоматом при создании сокета UDP.
Спонсор поста: испытываете трудности при установке и настройке Linux? Загляните на веб-сайт plutonit.ru. На нем вы найдете не только необходимые данные по установке Linux, но и интересную информацию о IP телефонии, Joomla, Asterisk и Windows.