`
java-mans
  • 浏览: 11449086 次
文章分类
社区版块
存档分类
最新评论

Delphi中UDP协议通讯

 
阅读更多

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信息并实现UDP通信

    Delphi FMX 获取安卓WIFI本机的IP信息 手机通过UDP与终端通信,实现发送数据(按协议发送,可以达到控制硬件产品的目的)

    Delphi Socket Udp实时在线云消费机服务器端源码.rar

    Delphi Socket Udp协议实时在线云消费机服务器端开发示例,本示例展示了Delphi监听UDP通讯端口,向端口发送信息,只需在本示例上加上数据库的增、删、查、改等操作就可快速完成实时一卡通消费系统。

    欧姆龙以太网通讯TCP/UDP例子及欧姆龙PLC程序例子说明

    欧姆龙TCP/UDP网络通讯例子,通讯的每个节点都有详细说明,还有欧姆龙PLC程序例子,以及中文版通讯功能块。

    针对 UDP 通讯协议的 Socket

    针对 UDP 通讯协议的 Socket 构件,附了 UDP 广播的使用范例

    Delphi 编写TCP/IP网络Socket通信程序

    计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都...

    delphiUDP广播.rar

    基于Delphi使用UDP通信,包含客户端和服务器端两个代码。 版本:Delphi builder10.2 主要是用IdUDPClient, IdUDPServer 参考链接:https://blog.csdn.net/qq_38204686/article/details/78244279 delphi简单的聊天室...

    基于UDP通讯的类似于QQ的功能,仅供学习使用

    个人测试过的delphi开发的类似于QQ的功能,学习时是可以的

    delphi上位机程序

    delphi 做上位机程序,与欧姆龙PLC遵循Fins协议通讯,Omron PLC Fins UDP 通讯资源

    网络读写器_Delphi7示例.rar

    Delphi7使用UDP控件与网络读卡器互传数据,展示了Delphi监听网络端口接收数据、向指定IP发送数据等功能,设备通讯协议说明:https://blog.csdn.net/zhangjin7422/article/details/114023669

    Delphi编程大师2003 4of5

    针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...

    Delphi编程大师2003 2of5

    针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...

    Delphi编程大师2003 1of5

    针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...

    Delphi编程大师2003 5of5

    针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...

    Delphi编程大师2003 3of5

    针对 UDP 通讯协议的 Socket 构件 能够更改 TForm.Cpation 显示字体的非可视构件 改良版的 TTimer 构件 利用 MODEM 提供拨号功能的非可视构件 加强版 TTimer 构件 TCommStatus串行状态控件 一个具备 FTP 功能的构件 ...

    Delphi深度编程技术

    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函数 ...

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    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 ...

    通讯模型封装,基于DIOCP YxdIocp包含有支持大并发的TCP、HTTP、UDP、WebSocket服务组件

    Delphi Windows IOCP 通讯模型封装,基于DIOCP。YxdIocp包含有支持大并发的TCP服务组件、HTTP服务组件、UDP服务组件、WebSocket服务组件,和TCP、UDP等基础客户端组件。 Delphi Windows IOCP 通讯模型封装,基于...

    新建文件夹 (3).rar_delphi 串口

    用udp协议进行局域网通讯,只支持192.168.0.0到192.168.0.255

    触摸查询终端机程序

    这是本人上次发布的《触摸查询终端机程序》的最新版本,这一版本使用DELPHI 2010开发,第三方控件除了TPicShow外,都是我自己写的,而且把...后一版本我会加上基于UDP协议的网络通讯功能及远程控制功能,敬请期待。

    Indy V9.0 Full Source For Delphi BCB

    INDY的全名是Internet Direct(也叫Winshoes),它是一套开放源代码的Internet控件集,它支持大部分流行的Internet协议,包括TCP、UDP、DNS、ICMP、FINGER、FTP、GOPHER、HTTP、POP3、SMTP、TELNET、WHOIS等,支持...

Global site tag (gtag.js) - Google Analytics