# 例程11:UDP二进制传输——服务器端,与例程12构成一对
time = TIME()
net = NET() # 定义一个NET对象
port = 4321
net = net.socket(net.IPv4,net.DGRAM,net.UDP) # 地址族:IPv4、数据流格式:DGRAM、通讯协议:UDP
# 把服务器地址与上述socket绑定
net.bind(net.IPv4,"192.168.111.195",port) # 参数分别是服务器的:地址族、网址、端口号
net.timeout(3000)
databuf = Binary("x00x11x22x33x44x55x66x77x88x99xaaxbbxccxddxeexff")
print("服务器伺服接收!\n")
while True
{
recvnet = net.udprecvNet() # 创建一个udp接收NET对象
recvnet.udprecv() # 服务器端等待接收来自客户端的请求
while recvnet.udprecvOK() != -1 {PowerDown(3)} # 等待udprecvOK退出,释放资源
x = recvnet.udprecvRead("string") # 读取数据
if x[0] == -1 {continue} # 第一项为-1表明超时,继续接收
RecvDatas = x[1] # 收到的数据
remote_addr = x[2] # 发送端的地址
while True
{
sendnet = net.udpsendNet() # 创建udp发送NET对象
sendnet.udpsend(net.IPv4,remote_addr,port,databuf,16) # 发送信息时,要使用客户端地址,和客户端绑定的端口号
while sendnet.udpsendOK() != -1 {PowerDown(3)} # 等待udpsend返回,,释放资源
xsend = sendnet.udpsendRead()
time.sleep(1000)
}
}
net.close() # 清除网络资源
# 例程12:UDP二进制接收——客户端,与例程11构成一对
gui = GUI("fine") # 定义GUI对象,用于图形界面显示
#gui.HideConsoleWindow() # 隐藏控制台窗口
net = NET() # 定义一个NET对象
time = TIME()
localaddr = net.local_addr() # 自动获取本地的IP地址
port = 4321 # 端口号
net = net.socket(net.IPv4,net.DGRAM,net.UDP) # 给net赋值(地址族、数据流格式、UDP传输)
net.bind(net.IPv4,localaddr,port) # 将net与本地地址"192.168.47.195"和端口4321绑定
net.timeout(3000) # 设置net的接收和发送超时时间
server_addr = "192.168.111.195" # 服务器地址,
# 设计群聊窗口界面
title = "UDP聊天程序——客户端"
size = [30,5,80,30]
testbox = ["群聊内容","textbox","N",10,1,66,17]
edit = ["发送内容","edit","s",10,19,64,3]
list = [title,size,testbox,edit]
gui.Fine(list) # 创建聊天Input窗口,返回资源ID
while True
{
sendnet = net.udpsendNet() # 分配发送资源
sendnet.udpsend(net.IPv4,server_addr,port,"连接服务器……",len("连接服务器……")) # 启动发送,地址是服务器地址
while sendnet.udpsendOK() != -1 {PowerDown(3)}
xsend = sendnet.udpsendRead() # 读取发送结果,释放资源
if(xsend > 0) {break}
gui.SendTextbox(["连接服务器……\n"]) # 显示收到的内容
time.sleep(500)
}
recvnet = net.udprecvNet() # 创建udp接收NET对象
recvnet.udprecv() # 启动接收服务,接收长度限制在1024字节以内
while gui.FineClosed() != -1 # 检测聊天窗口是否关闭
{
PowerDown(3) # 节能设置
if recvnet.udprecvOK() == -1 # udprecv返回-1,表明退出udprecv函数,释放资源
{
xrecv = recvnet.udprecvRead("binary") # 读取接收结果
if xrecv[0] > 0 # 如果超时返回-1,否则,返回接收到的字节数
{
recvdada = xrecv[1] # 接收到的二进制数据
str = sprint(recvdada) + "\n" # 转换成字符串
gui.SendTextbox([str]) # 显示收到的内容
}
# 处理完上次收到的数据后,再次进入伺服接收状态
recvnet = net.udprecvNet() # 创建udp接收NET对象
recvnet.udprecv() # 启动接收服务,接收长度限制在1024字节以内
}
}
net.close() #清除网络资源