首页 > 后端开发 > Python教程 > 为什么我的 Python 套接字在第一次 `recv()` 调用后不接收数据,除非我修改客户端?

为什么我的 Python 套接字在第一次 `recv()` 调用后不接收数据,除非我修改客户端?

Susan Sarandon
发布: 2024-11-28 20:10:16
原创
558 人浏览过

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Python Socket 不发送数据就无法接收数据

问题:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板