第三十二章 UDP 客户端 服务器通信
本页介绍如何使用 UDP
在进程之间建立远程通信。
介绍
通过%Net.UDP
来支持 UDP
。此类提供以下方法: Send()
数据包到指定的目的地和端口、 Recv()
来自套接字的数据包以及Reply()
发送器最后收到的数据包。
目标被标识为本地主机名或者 IPv4
或 IPv6
主机地址。该端口可以是指定的端口号或动态端口分配。
建立UDP
套接字
要使用 UDP
,必须使用%New()
方法来创建 UDP
套接字对象。然后,该对象实例用于发送、接收和回复数据包传输。
创建 UDP
套接字对象时,可以指定端口号和主机地址,如下例所示:
SET UPDOref=##class(%Net.UDP).%New(3001,"0.0.0.0")
端口号和主机地址都是可选的。 %New()
方法返回 UDP
套接字对象实例的 OREF
(对象引用)。
- 服务器等待接收请求,然后提供所请求的信息。因此,传输的这一方可以称为接收方或提供方。当提供者创建
UDP
对象时,它必须定义接收请求的端口号。 - 客户端发送信息请求,然后接收回复。因此,传输的这一方可以称为发送方或请求方。当请求者创建
UDP
对象时,它可以使用动态端口号。默认值为0
。当它发送数据包时,必须指定提供者的主机名和端口号。
主机地址
Send()
方法指定目标的二进制地址。这是主机地址的二进制版本。必须使用GetHostAddr()
方法创建此二进制主机地址,如下所示:
SET client=##class(%Net.UDP).%New()
SET addrbin=##class(%Net.UDP).GetHostAddr("172.16.61.196")
WRITE client.Send("message text",addrbin,3001)
以向GetHostAddr()
指定主机名、IPv4
地址或 IPv6
地址,如以下示例所示:
SET hostname="MYLAPTOP"
SET IPv4="172.16.61.196"
SET IPv6="::1"
SET flag=$SYSTEM.INetInfo.CheckAddressExist(hostname)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(hostname)
WRITE "host name valid",! }
ELSE { WRITE "not a hostname: ",hostname,! }
SET flag=$SYSTEM.INetInfo.CheckAddressExist(IPv4)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(IPv4)
WRITE "IPv4 valid",! }
ELSE { WRITE "not an IPv4 address: ",IPv4,! }
SET flag=$SYSTEM.INetInfo.CheckAddressExist(IPv6)
IF flag=1 { SET addrbin=##class(%Net.UDP).GetHostAddr(IPv6)
WRITE "IPv6 valid",! }
ELSE { WRITE "not an IPv6 address: ",IPv6,! }
可以使用AddrToHostName()
方法将此二进制主机地址扩展回主机名,如以下示例所示:
SET addrbin=##class(%Net.UDP).GetHostAddr("MYLAPTOP")
WRITE $SYSTEM.INetInfo.AddrToHostName(addrbin)
可以使用LocalHostName()
法来确定主机名。可以使用HostNameToAddr()
方法将主机名转换为 IPv4
或 IPv6
地址,如以下示例所示:
SET localhost=$SYSTEM.INetInfo.LocalHostName() /* get host name */
WRITE "local host name is ",localhost,!
SET addrbin=##class(%Net.UDP).GetHostAddr(localhost) /* compress to binary address */
WRITE "binary form of IP address is ",addrbin,!
SET hostname=$SYSTEM.INetInfo.AddrToHostName(addrbin) /* expand binary address to host name */
WRITE "binary IP address expands to ",hostname,!
SET ipaddr=$SYSTEM.INetInfo.HostNameToAddr(hostname) /* host name to IP address */
WRITE "hostname corresponds to IP address ",ipaddr,!