问题:
Python 的 socket.recv() 方法不返回编辑回显服务器代码后第二次调用时的数据,以避免将数据发送回client.
分析:
TCP 套接字作为数据流运行,发送和接收调用之间缺乏一对一的关联。最初的代码遵循特定的协议,其中服务器准确地发回收到的数据,直到客户端关闭连接。
修改改变了规则,导致服务器不断接收和丢弃数据,直到客户端响应为止结束了他们的结局。客户端因期望立即响应而无限期挂起。
解决方案:
要解决此问题,客户端必须调整其行为以匹配修改后的服务器协议。
客户端修改:
关闭套接字的传出端以发出完成信号,允许服务器发送响应。实现多个 recv() 操作以处理潜在的数据碎片。
import socket HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') s.shutdown(socket.SHUT_WR) data = b'' while True: buf = s.recv(1024) if not buf: break data += buf s.close() print('Received', repr(data))
更新了服务器代码:
维护更改后的协议,一旦客户端关闭传入连接就发送“ok”。
import socket HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(b'ok') conn.shutdown(socket.SHUT_WR) conn.close()
以上是为什么我的 Python 套接字在第一次 `recv()` 调用后不接收数据,除非我修改客户端?的详细内容。更多信息请关注PHP中文网其他相关文章!