IdUDPServer,IdUDPClient
https://blog.csdn.net/anguangqing/article/details/5977818
DELPHI中有两个UDP控件:TIdUDPServer和TIdUDPClient控件,可用于传输UDP数据;用法都很简单,主要是一些细微的特性,弄清楚了对正确使用这两种控件有很大的好处;下面分别介绍:
一、 TIdUDPServer:代表一个UDP的服务端,接收UDP客户端发过来的数据;在FORM上放置一个TIdUDPServer控件,命名为UDPSvr,在FormCreate事件中编写如下代码:
UDPSvr.Bindings.Add;
UDPSvr.Bindings[0].IP := '192.168.2.117';
UDPSvr.Bindings[0].Port := 1812;
UDPSvr.Active := True;
在UDPSvr控件的OnUDPRead事件中编写如下代码:
var
Buffer: array[0..1024] of Char;
iSize: integer;
sData: string;
begin
ZeroMemory(@Buffer,sizeof(Buffer));
iSize := AData.Size;
if iSize > 1024 then
begin
iSize := 1024;
end;
AData.Seek(0,soFromBeginning);
iSize := AData.Read(Buffer,iSize);
。。。。。{对接收数据的处理}
end;
这样就完成了一个可以接收数据的UDP应用程序;
其实TIdUDPServer有发送数据的方法:Send和SendBuffer,是继承自TIdUPDBase,所以只要利用TIdUDPServer控件就可完成数据的收发,在FORM上添加一个Tbutton控件,在Click事件中添加如下代码;
var
Buffer: array[0..1024] of Char;
sText: string;
iLen: integer;
begin
sText := '12345678'
ZeroMemory(@Buffer,sizeof(Buffer));
StrPCopy(Buffer,sText);
iLen := Length(sText);
UDPSvr.SendBuffer('192.168.2.117',1814,Buffer,iLen);
end;
这样就可以向另一UDP应用程序发送数据;
一个TIdUDPServer控件可以打开多个端口,如下的代码打开了两个端口:
UDPSvr.Bindings.Add;
UDPSvr.Bindings[0].IP := GetLocalIP;
UDPSvr.Bindings[0].Port := 1812;
UDPSvr.Bindings.Add;
UDPSvr.Bindings[1].IP := GetLocalIP;
UDPSvr.Bindings[1].Port := 1813;
UDPSvr.Active := True;
当打开多个端口时,发送数据是从哪个端口发送出去呢?根据测试结果是:最近收到数据的那个端口;如果还没有收到过数据,则为Bindings[0].Port;
在接收数据的事件中,有一个TidSocketHandle类型的参数:Abinding;这个参数有两对属性:
IP 、Port:代表本地IP地址和端口;
PeerIP、PeerPort:代表远端IP地址和端口;
其中PeerIP、PeerPort在交复发送数据的UDP应用中是很有用的,因为UDP服务端可以向PeerIP和PeerPort回应数据,而不用再去设置UDP客户端的IP地址和端口号(这种方法应用不当,会产生问题,下面会说到);
二、 TIdUDPClient:代表一个UDP的客户端,专门用于发送UDP数据,不能接收数据,因为没有相应的事件和方法;前面已经说过,利用TIdUDPServer控件就可以完成UDP数据的收发,所以一直怀疑TIdUDPClient控件存在的必要性;除非有一个UDP的客户端只发送数据,而从不接收数据,这样的客户端应该很少;后来我想,可能可以用TIdUDPClient控件来分担TIdUDPServer控件的负载,在一个需要收发大量UDP数据的服务端中,TIdUDPServer控件只接收数据,另外专门用一个TIdUDPClient控件发送数据,也许可以提高应用程序的性能(没有经过验证);利用TIdUDPClient发送数据有两种方式:
1、 利用TIdUDPClient控件本身的Send和SendBuffer方法,这时需要设置Host和Port属性,在FORM上放置一个TIdUDPClient控件,命名为:UDPClt;分别设置Host和Port属性值为:192.168.2.117和1814;再编写如下代码:
var
Buffer: array[0..1024] of Char;
sText: string;
iLen: integer;
begin
sText := '12345678';
ZeroMemory(@Buffer,sizeof(Buffer));
StrPCopy(Buffer,sText);
iLen := Length(sText);
UDPClt.SendBuffer(Buffer,iLen);
end;
2、 不需要设置Host和Port属性,而直接利用从TIdUPDBase继承来的Send和SendBuffer方法,也可发送数据,代码如下所示:
UDPClt.SendBuffer('192.168.2.117',1814,Buffer,iLen);
TIdUDPClient控件发送数据时是通过哪个端口发出去的呢?根据测试的结果:是随机的;这样就给上面说过的UDP服务端可以向PeerIP和PeerPort回应数据造成了麻烦,也就是说如果UDP服务端收到的数据是通过TIdUDPClient控件发过来的,就不能通过PeerIP和PeerPort回应回去,而应设定客户端的IP地址和端口号;在具体应用中是哪种情况,要根据测试结果而定。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 在 VS Code 中,一键安装 MCP Server!
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 后端思维之高并发处理方案
· 千万级大表的优化技巧