Indy实现UDP通讯自动识别客户端并进行广播

unit Unit3;

interface

uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, IdAntiFreezeBase, IdAntiFreeze, IdUDPClient, IdBaseComponent,   IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle,Contnrs;

type  

 TForm3 = class(TForm)    

 IdUDPServer1: TIdUDPServer;    

 IdUDPClient1: TIdUDPClient;    

 IdAntiFreeze1: TIdAntiFreeze;    

Button1: TButton;    

GroupBox1: TGroupBox;    

Memo1: TMemo;    

GroupBox2: TGroupBox;    

ListBox1: TListBox;    

Button2: TButton;    

Button3: TButton;    

procedure Button1Click(Sender: TObject);    

procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);    

procedure Button2Click(Sender: TObject);    

procedure Button3Click(Sender: TObject);    

procedure FormCreate(Sender: TObject);    

procedure FormDestroy(Sender: TObject);  

private     { Private declarations }  

public     { Public declarations }    

procedure setudpclient(const ip:string;port:Integer;udpclient:TIdUDPClient);  

end;

var   Form3: TForm3;   list:TStringList; implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

begin  

IdUDPServer1.DefaultPort:=10030;  

try    

  IdUDPServer1.Active:=True;    

  ListBox1.Items.Add('服务端启动成功!');  

except on e:Exception do  

begin    

   Memo1.Lines.Add('服务端启动失败:'+e.Message);   end;

  end;  

   Button1.Enabled:=not IdUDPServer1.Active;  

   Button2.Enabled:= IdUDPServer1.Active; end;

procedure TForm3.Button2Click(Sender: TObject);

begin  

  IdUDPServer1.Active:=False;  

  Button1.Enabled:=not IdUDPServer1.Active;  

  Button2.Enabled:= IdUDPServer1.Active;

end;

procedure TForm3.Button3Click(Sender: TObject);

var  

   i:Integer;

begin  

    for I := 0 to list.Count-1 do  

begin      

    IdUDPServer1.Broadcast('即将关闭通讯服务,请注意!',strtoint(list[i]));  

end;

end;

procedure TForm3.FormCreate(Sender: TObject);

begin  

    list:=TStringList.Create;

end;

procedure TForm3.FormDestroy(Sender: TObject);

begin  

    FreeAndNil(list);

end;

procedure TForm3.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);

var  

  s:string;  

  sm:TStringStream;

begin  

   try    

      sm:=TStringStream.Create('');    

      sm.CopyFrom(AData,AData.Size);    

      s:=sm.DataString;  

   finally    

     FreeAndNil(sm);  

end;  

     Memo1.Lines.Add(s);  

    setudpclient(ABinding.PeerIP,ABinding.PeerPort,IdUDPClient1);  

if IdUDPClient1.Active then  

begin    

      IdUDPClient1.Send('收到您发送的信息如下:'+#10#13+s);  

end;

end;

procedure TForm3.setudpclient(const ip: string; port: Integer; udpclient: TIdUDPClient);

var  

    pos:Integer;

begin  

    if udpclient.Active then     

   udpclient.Active:=False;  

    udpclient.Host:=ip;  

   udpclient.Port:=port;  

   try    

     udpclient.Active:=True;    

     ListBox1.Items.Add('时间:'+datetimetostr(now));    

     ListBox1.Items.Add('客户端:'+ip+' 端口:'+inttostr(port)+'请求连接');    

     if not list.Find(IntToStr(port),pos) then      {防止重复数据}      

     list.Add(IntToStr(port));

  except on e:Exception do  

  begin    

      Memo1.Lines.Add('客户端启动失败:'+e.Message);    

  Exit;  

 end;

  end;

end;

end.

猜你喜欢

转载自www.cnblogs.com/sundh1981/p/11060297.html