第三十二章 UDP 客户端 服务器通信

文章目录

第三十二章 UDP 客户端 服务器通信

本页介绍如何使用 UDP 在进程之间建立远程通信。

介绍

通过%Net.UDP来支持 UDP。此类提供以下方法: Send()数据包到指定的目的地和端口、 Recv()来自套接字的数据包以及Reply()发送器最后收到的数据包。

目标被标识为本地主机名或者 IPv4IPv6 主机地址。该端口可以是指定的端口号或动态端口分配。

建立UDP套接字

要使用 UDP,必须使用%New()方法来创建 UDP 套接字对象。然后,该对象实例用于发送、接收和回复数据包传输。

创建 UDP 套接字对象时,可以指定端口号和主机地址,如下例所示:

复制代码
  SET UPDOref=##class(%Net.UDP).%New(3001,"0.0.0.0")

端口号和主机地址都是可选的。 %New()方法返回 UDP 套接字对象实例的 OREF(对象引用)。

  • 服务器等待接收请求,然后提供所请求的信息。因此,传输的这一方可以称为接收方或提供方。当提供者创建 UDP 对象时,它必须定义接收请求的端口号。
  • 客户端发送信息请求,然后接收回复。因此,传输的这一方可以称为发送方或请求方。当请求者创建 UDP 对象时,它可以使用动态端口号。默认值为0。当它发送数据包时,必须指定提供者的主机名和端口号。

主机地址

Send()方法指定目标的二进制地址。这是主机地址的二进制版本。必须使用GetHostAddr()方法创建此二进制主机地址,如下所示:

java 复制代码
  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 地址,如以下示例所示:

java 复制代码
  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()方法将此二进制主机地址扩展回主机名,如以下示例所示:

java 复制代码
  SET addrbin=##class(%Net.UDP).GetHostAddr("MYLAPTOP")
  WRITE $SYSTEM.INetInfo.AddrToHostName(addrbin)

可以使用LocalHostName()法来确定主机名。可以使用HostNameToAddr()方法将主机名转换为 IPv4IPv6 地址,如以下示例所示:

java 复制代码
  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,!
相关推荐
一方热衷.15 分钟前
在线安装对应版本NVIDIA驱动
linux·运维·服务器
m0_6948455719 分钟前
tinylisp 是什么?超轻量 Lisp 解释器编译与运行教程
服务器·开发语言·云计算·github·lisp
*小海豚*22 分钟前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
2501_9151063225 分钟前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
消失的旧时光-194339 分钟前
Linux 编辑器入门:nano 与 vim 的区别与选择指南
linux·运维·服务器
那就回到过去1 小时前
MSTP路由协议简介
网络·网络协议·tcp/ip·ensp
starfire_hit1 小时前
JAVAWEB根据前台请求获取用户IP
java·服务器·网络
云边有个稻草人2 小时前
打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车
运维·服务器·cpolar
阿钱真强道2 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
乾元2 小时前
终端安全(EDR):用深度学习识别未知勒索软件
运维·人工智能·网络协议·安全·网络安全·自动化·安全架构