首页 >后端开发 >Python教程 >为什么我的 Python 套接字不发送数据而无法接收数据?

为什么我的 Python 套接字不发送数据而无法接收数据?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-30 18:59:12551浏览

Why Doesn't My Python Socket Receive Data Without Sending?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn