You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用systemd.socket配合Python脚本实现数据接收时客户端挂起的问题排查

systemd.socket配合Python脚本实现数据接收时客户端挂起的问题排查

我来帮你排查这个客户端挂起的问题,核心原因是服务端与客户端的数据交互逻辑不匹配,咱们一步步拆解问题并给出解决方案:

问题根源分析

  1. 服务端的行读取阻塞
    你的服务端代码用了sys.stdin.readline(),这个方法会一直阻塞,直到读取到**换行符\n**才会返回。但你的客户端发送的是'Hello',没有携带换行符,导致服务端一直卡在读取步骤,无法向客户端返回数据,客户端的recv()自然也会一直等待,最终出现挂起。
    而socat或nc在你输入内容后会自动添加换行符(或者你手动按了回车),所以服务端能正常读取并返回,这就是它们能正常工作的原因。

  2. 客户端发送数据的类型问题
    Python3的socket.send()方法要求传入字节对象,但你直接传递了字符串'Hello',虽然部分环境会自动转换,但这属于不规范写法,容易引发兼容性问题。

  3. 服务端输出的缓冲问题
    服务端用sys.stdout.write()后,标准输出可能因为缓冲机制不会立刻把数据发回客户端,导致响应延迟甚至阻塞。

修复后的代码示例

修改后的客户端代码

#!/usr/bin/python3
import socket

host = '127.0.0.1'
port = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# 发送带换行符的字节数据,匹配服务端的readline()逻辑
s.send(b'Hello\n')
response = s.recv(1024)
if response:
    print("OK")
    print(f"收到响应: {response.decode()}")
s.close()  # 记得关闭socket连接

修改后的服务端代码

#!/usr/bin/python3
import sys
# 读取客户端发送的一行数据(包含换行符)
data = sys.stdin.readline()
sys.stdout.write(data)
# 强制刷新输出缓冲区,确保数据立即发回客户端
sys.stdout.flush()

验证步骤

  1. 重新加载systemd配置:
    sudo systemctl daemon-reload
    
  2. 重启socket服务:
    sudo systemctl restart test.socket
    
  3. 运行修改后的客户端脚本,此时应该能正常收到响应并打印OK了。

备注:内容来源于stack exchange,提问作者khoshahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:44:50