Python Socket Not Receiving Without Sending
这个问题深入研究了一个问题,Python 文档中的修改后的套接字示例在发送后无法接收数据初始发送已被禁用。问题的出现是由于 TCP 套接字的固有性质,它将数据视为连续流。
在原始示例中,while 循环确保服务器回显收到的每条消息。这建立了一个简单的协议,其中发送触发响应。
但是,在修改版本中,删除回显功能会破坏协议。服务器成为数据的无限消费者,等待客户端关闭连接。由于发送被禁用,客户端的数据既没有被确认也没有回显,导致它在等待响应时挂起。
解决方案在于使客户端的行为适应新协议。客户端不应期望立即响应,而应优雅地关闭其连接端。这向服务器发出已完成发送数据的信号,提示服务器发送预期的“ok”消息。
为了增强可靠性,客户端可以使用多个 recv 调用来处理可能的数据碎片。此修改可确保成功接收分段消息。
更新的示例代码:
服务器
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()
客户端
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))
通过遵循这些修改,该示例确保客户端不会挂起,服务器会优雅地处理数据交换,即使服务器没有立即响应。
以上是为什么我的 Python 套接字不发送数据而无法接收数据?的详细内容。更多信息请关注PHP中文网其他相关文章!