如何确认Python中客户端是否收到了服务端的消息
在Python中客户端是否收到了服务端的消息服务端自己是不清楚的那就可能有一个很糟糕的情况了服务端向客户端发送的数据不幸丢失了客户端没有收到服务端以为数据已经被对方接受了而客户端还在傻傻等着。怎么办呢我们想办法优化一下程序规定在客户端接受到订单送达的消息之后就要向服务端发送“我已收到谢谢”当然这在现实中很多人懒得这么做服务端看到这条消息才能证明客户确实是收到骑手送的餐品了如果超过 10 秒没有收到消息那就重新发送消息进行重试如果过了 10 秒还是没有收到客户端确认的消息就再次重试重试的最大次数为 5 次。要想实现这个功能需要用到一个特别的网络库 —— eventlet。eventlet 是一个用来处理和网络相关的 python 库函数而且可以通过协程来实现并发在 eventlet 里把 “协程” 叫做 greenthread(绿色线程)。所谓并发就是开启了多个 greenthread并且对这些 greenthread 进行管理以实现非阻塞式的 I/O。我们需要用到 eventlet.Timeout() 这个函数控制程序的超时时间当程序在这段时间内没有执行完成就会抛出异常这样在程序中遇到了异常就做相应的异常处理就避免了阻塞的情况。改进之后的服务端代码实现如下import time from socket import * import eventlet eventlet.monkey_patch() #用于绿化一些python的模块 serverSocketsocket(AF_INET,SOCK_STREAM) #创建套接字对象 serverSocket.bind((127.0.0.1,6666)) #绑定IP和端口必须是元组形势 serverSocket.listen(1) #设置连接池挂起的数量 try: connectionSocket,addrserverSocket.accept() #接受客户端连接connectionSocket是客户端连接服务器的信号addr是客户端地址 print(收到addr[0]:str(addr[1])的订单) time.sleep(10) #让线程等待10秒 connectionSocket.send(bytes(您的订单已送达, encodingutf-8)) # 向客户端发送消息 for i in range(0,5): teventlet.Timeout(10,False) #设置超时时间为10秒 try: recv_dataconnectionSocket.recv(1024) print(收到消息断开连接...) break except eventlet.timeout.Timeout as e: print(超时重试中...) connectionSocket.send(bytes(您的订单已送达, encodingutf-8)) # 向客户端发送消息 finally: t.cancel() #终止进程 connectionSocket.close() #断开连接 except IOError: connectionSocket.close() serverSocket.close() #关闭套接字对象服务端程序运行后正常执行客户端程序运行截图如下