优秀作品

# 例程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()  #清除网络资源


0