Delphi中UDP协议通讯
先在type域中定义Record(未压缩)或Packed Rcord(压缩包)结构体,再用Indy的idUDPclient和idUDPServer分别负责发送和接收
如:注意每定义一节都接一个End;表示定义完其中一个,末尾不再加其他end;
{------------------------------------------------------}
type
tcGetUserBuffer = record
ID: Integer;
Size: Integer;
nType: DWORD; //Dword是无符号32位长整型,直接赋十进制数就可以了。
UserID: Dword;
IMEI: array [0..23] of char;
end;
tcGetUserNextBuffer = record
ID: integer;
size: integer;
nTtype: Dword;
IP: Dword;
Port: Dword;
info:array[0..9] of char; //这是定义一个十位的Char类型,在VC++中用Char name[10][定义
end;
{------------------------------------------------------}
上面只是定义了结构体,在使用时,需要注意的是:这只是一个结构,也就是一个类似于骨架的东西,没有实际意义,在给结构体赋值(一般称为填包)时,发出去和接收到的只是一堆数组,所以发送和接收时都需要用到定义的结构体。另外有些结构体为了方便,也可以像下面这样定义包头和包体,在接收处理时就会更方便、灵活一些。
type
Head = record
ID:integer;
Command:Dword;
end;
tGetInfo = record
userID: Dword;
end;
tGetInfoBuffer = record;
tHead: Head;
tBody:tGetInfo;
end;
像上面这样就定义了一个多维的结构体,其实到最后还是一样的数组发送和接收。
现在看看怎么发送:
Procedure Button1_click();
var
Buffer: tcGetUserBuffer;
begin
Buffer.ID=1234;
Buffer.nType=4;
... //结构一般要填满,这里省略
IDudpClient.SendBuffer(Buffer,Sizeof(tcGetUserBuffer)) //Sizeof一定要获得结构体的长度才行。
end;
以上是发送一个包,现在看看接收包和处理包。
procedure TForm1.IdUS1UDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle); //注意,D7中要手动uses[IdSocketHandle]这个类,自己加在上面。
Var
Buffer1: tcGetUserBuffer;
Buffer2: tcGetUserNextBuffer ;
//依此类推,把要用到的变量名Buffer[n]和结构体都定义好,以区分比较复杂的包类型。
begin
//下面是根据包长度判断不同的包,来分别处理它们。
if length(AData)=sizeof(tcGetUserBuffer) then
begin
Adata.read(Buffer1,Adata.size);
showmessage(inttostr(Buffer1.ID));
Abinding.sendto(Abinding.peerip,Abinding.peerport,data,sizeof(dataRecord)) //这句的意思是向发数据的IP和端口号回复数据,这个data和dataRecord没有填包和定义,实际应用时,要注意。
end;
if length(AData)=sizeof(tcGetUserNextBuffer) then
begin
Adata.read(Buffer2,Adata.size);
showmessage(inttostr(Buffer1.ID));
end;
end;
**指针的用法也很关键的
比如UDPserver收到数据包也可以用一个字节数组来接收
Var
ArrByte: Array [0..64000] of byte;
begin
Adata.readBuffer(ArrByte,Adata.size);
end;
在使用时,则要用到各种指针操作命令了。
Arrbyte[0]就是从数组的第一个字节。
读取字符串时,要用到Pchar(@ArrByte[0]),注意只用了一个@,后面不接^。
读取数字时,用Pinteger(@ArrByte[0])^,这里用了两个符号,要注意它们的 位置。
注意:上面两例都是读数组的所有字节,所以,在实际用时,可能要用到这个命令
Move(ArrByte1,ArrByte2,tSize)
两个数组没有定义,后面的大小要看实际情况。
Move是一个很好用的东东,有时可能需要从结构Record复制到数组,也是一样的:
Move(Buffer1,ArrByte,tSize)
这样就可以了。
其实Delphi在实际处理中还有很多东西,以后慢慢写,比如用线程发包、收包处理,包频繁发送,量大的还要做发送队列用到很多控件和类,以后再写啦。
分享到:
相关推荐
Delphi FMX 获取安卓WIFI本机的IP信息 手机通过UDP与终端通信,实现发送数据(按协议发送,可以达到控制硬件产品的目的)
Delphi Socket Udp协议实时在线云消费机服务器端开发示例,本示例展示了Delphi监听UDP通讯端口,向端口发送信息,只需在本示例上加上数据库的增、删、查、改等操作就可快速完成实时一卡通消费系统。
欧姆龙TCP/UDP网络通讯例子,通讯的每个节点都有详细说明,还有欧姆龙PLC程序例子,以及中文版通讯功能块。
针对 UDP 通讯协议的 Socket 构件,附了 UDP 广播的使用范例
计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都...
基于Delphi使用UDP通信,包含客户端和服务器端两个代码。 版本:Delphi builder10.2 主要是用IdUDPClient, IdUDPServer 参考链接:https://blog.csdn.net/qq_38204686/article/details/78244279 delphi简单的聊天室...
个人测试过的delphi开发的类似于QQ的功能,学习时是可以的
delphi 做上位机程序,与欧姆龙PLC遵循Fins协议通讯,Omron PLC Fins UDP 通讯资源
Delphi7使用UDP控件与网络读卡器互传数据,展示了Delphi监听网络端口接收数据、向指定IP发送数据等功能,设备通讯协议说明:https://blog.csdn.net/zhangjin7422/article/details/114023669
针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...
针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...
针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...
针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...
针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...
8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 客户/服务器模式 8.1.4 面向连接的协议套接字的调用 8.1.5 面向无连接协议的套接字的调用 8.2 利用Winsock API实现Socket编程 8.2.1 常用WinSockAPI函数 ...
7.2.1 多层应用系统的结构 7.2.2 存取数据的运作原理 7.2.3 更新数据的运作原理 7.3 容错处理和负载平衡 7.4 Active Form 第8章 Socket编程 8.1 WinSock基础 8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 ...
Delphi Windows IOCP 通讯模型封装,基于DIOCP。YxdIocp包含有支持大并发的TCP服务组件、HTTP服务组件、UDP服务组件、WebSocket服务组件,和TCP、UDP等基础客户端组件。 Delphi Windows IOCP 通讯模型封装,基于...
用udp协议进行局域网通讯,只支持192.168.0.0到192.168.0.255
这是本人上次发布的《触摸查询终端机程序》的最新版本,这一版本使用DELPHI 2010开发,第三方控件除了TPicShow外,都是我自己写的,而且把...后一版本我会加上基于UDP协议的网络通讯功能及远程控制功能,敬请期待。
INDY的全名是Internet Direct(也叫Winshoes),它是一套开放源代码的Internet控件集,它支持大部分流行的Internet协议,包括TCP、UDP、DNS、ICMP、FINGER、FTP、GOPHER、HTTP、POP3、SMTP、TELNET、WHOIS等,支持...