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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)