如你所知数据包格式套接字Datagram Sockets也叫“无连接的套接字”在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递它有以下特征强调快速传输而非传输顺序传输的数据可能丢失也可能损毁限制每次传输的数据大小数据的发送和接收是同步的。数据包套接字也使用 IP 协议作路由但是它不使用 TCP 协议而是使用 UDP 协议User Datagram Protocol用户数据报协议。实际应用中QQ 视频聊天和语音聊天主要使用 SOCK_DGRAM 来传输数据因为首先要保证通信的效率尽量减小延迟而数据的正确性是次要的即使丢失很小的一部分数据视频和音频也可以正常解析最多出现噪点或杂音不会对通信质量有实质的影响。当然SOCK_DGRAM 没有想象中的糟糕不会频繁的丢失数据数据错误只是小概率事件。我们将之前的程序改写一下让服务端与客户端之间使用 UDP 协议进行通信。服务端代码实现import time from socket import * import eventlet eventlet.monkey_patch() #用于绿化一些python的模块 serverSocketsocket(AF_INET,SOCK_DGRAM) #创建套接字对象 serverSocket.bind((127.0.0.1,6666)) #绑定IP和端口必须是元组形势 try: message,addrserverSocket.recvfrom(1024) #接受客户端连接connectionSocket是客户端连接服务器的信号addr是客户端地址 print(收到addr[0]:str(addr[1])的订单) time.sleep(10) #让线程等待10秒 serverSocket.sendto(bytes(您的订单已送达, encodingutf-8),addr) # 向客户端发送消息 for i in range(0,5): teventlet.Timeout(10,False) #设置超时时间为10秒 try: recv_data,addrserverSocket.recvfrom(1024) print(收到消息断开连接...) break except eventlet.timeout.Timeout as e: print(超时重试中...) serverSocket.sendto(bytes(您的订单已送达, encodingutf-8),addr) # 向客户端发送消息 finally: t.cancel() #终止进程 except IOError: serverSocket.close() #关闭套接字对象 serverSocket.close() #关闭套接字对象客户端代码实现from socket import * server_addr(127.0.0.1,6666) #服务器的地址 clientSocketsocket(AF_INET,SOCK_DGRAM) #创建套接字对象 try: print(等待外卖骑手送餐...) clientSocket.sendto(bytes(等待外卖骑手送餐...,encodingutf-8),server_addr) recv_data,addrclientSocket.recvfrom(1024) #接受服务器传来的消息 print(str(recv_data,encodingutf-8)) #输出到控制台 clientSocket.sendto(bytes(我已收到谢谢,encodingutf-8),server_addr) #向服务端发送消息 except IOError: clientSocket.close() #关闭套接字对象运行截图如下注意此时使用 UDP 协议通信时客户端与服务端之间没有建立连接这是因为 UDP 协议本身就是无连接的。服务端不再监听客户端的连接状态那么客户端就必须先发送消息告知对方服务端才能知道客户下单了。在实际生活中UDP 协议被应用于视频、音频等多媒体通信。
认识Python数据包套接字
如你所知数据包格式套接字Datagram Sockets也叫“无连接的套接字”在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递它有以下特征强调快速传输而非传输顺序传输的数据可能丢失也可能损毁限制每次传输的数据大小数据的发送和接收是同步的。数据包套接字也使用 IP 协议作路由但是它不使用 TCP 协议而是使用 UDP 协议User Datagram Protocol用户数据报协议。实际应用中QQ 视频聊天和语音聊天主要使用 SOCK_DGRAM 来传输数据因为首先要保证通信的效率尽量减小延迟而数据的正确性是次要的即使丢失很小的一部分数据视频和音频也可以正常解析最多出现噪点或杂音不会对通信质量有实质的影响。当然SOCK_DGRAM 没有想象中的糟糕不会频繁的丢失数据数据错误只是小概率事件。我们将之前的程序改写一下让服务端与客户端之间使用 UDP 协议进行通信。服务端代码实现import time from socket import * import eventlet eventlet.monkey_patch() #用于绿化一些python的模块 serverSocketsocket(AF_INET,SOCK_DGRAM) #创建套接字对象 serverSocket.bind((127.0.0.1,6666)) #绑定IP和端口必须是元组形势 try: message,addrserverSocket.recvfrom(1024) #接受客户端连接connectionSocket是客户端连接服务器的信号addr是客户端地址 print(收到addr[0]:str(addr[1])的订单) time.sleep(10) #让线程等待10秒 serverSocket.sendto(bytes(您的订单已送达, encodingutf-8),addr) # 向客户端发送消息 for i in range(0,5): teventlet.Timeout(10,False) #设置超时时间为10秒 try: recv_data,addrserverSocket.recvfrom(1024) print(收到消息断开连接...) break except eventlet.timeout.Timeout as e: print(超时重试中...) serverSocket.sendto(bytes(您的订单已送达, encodingutf-8),addr) # 向客户端发送消息 finally: t.cancel() #终止进程 except IOError: serverSocket.close() #关闭套接字对象 serverSocket.close() #关闭套接字对象客户端代码实现from socket import * server_addr(127.0.0.1,6666) #服务器的地址 clientSocketsocket(AF_INET,SOCK_DGRAM) #创建套接字对象 try: print(等待外卖骑手送餐...) clientSocket.sendto(bytes(等待外卖骑手送餐...,encodingutf-8),server_addr) recv_data,addrclientSocket.recvfrom(1024) #接受服务器传来的消息 print(str(recv_data,encodingutf-8)) #输出到控制台 clientSocket.sendto(bytes(我已收到谢谢,encodingutf-8),server_addr) #向服务端发送消息 except IOError: clientSocket.close() #关闭套接字对象运行截图如下注意此时使用 UDP 协议通信时客户端与服务端之间没有建立连接这是因为 UDP 协议本身就是无连接的。服务端不再监听客户端的连接状态那么客户端就必须先发送消息告知对方服务端才能知道客户下单了。在实际生活中UDP 协议被应用于视频、音频等多媒体通信。