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

Socket通信中无限循环无法终止问题求助

Socket通信接收脚本无限循环问题解决

你的脚本卡住不是循环逻辑错误,是recv()的阻塞特性导致的:

  • 当服务器发送完数据但没主动关闭连接时,s.recv(1024)会一直阻塞等待新数据,不会返回空字节,自然触发不了break条件,脚本就停在这不动了。

给你三个可行的解决办法:

1. 让服务器发送完数据后关闭连接

在服务器端代码里,发送完所需数据后调用s.close(),这样客户端的recv()会收到空字节,触发else分支的break,循环正常结束。

2. 约定数据结束标记

如果服务器不能关闭连接(比如后续还要通信),可以在发送的数据末尾加一个双方约定的结束符(比如'EOF'或'\n')。客户端接收时检查是否收到这个标记,收到就跳出循环。修改后的代码示例:

buffer = ''
while True:
    data = s.recv(1024)
    if not data:  # 先处理连接关闭的情况
        break
    recv_dec = data.decode('utf-8')
    buffer += recv_dec
    print(buffer)
    # 检查是否包含约定的结束标记
    if 'EOF' in buffer:
        # 可选:移除结束标记
        buffer = buffer.rstrip('EOF')
        break

3. 给Socket设置超时

如果不想依赖服务器操作,也可以给客户端Socket设置超时时间,超过指定时间没收到新数据就结束接收:

import socket

# 假设s是已经创建好的socket对象
s.settimeout(5)  # 设置5秒超时,可根据需求调整
buffer = ''

try:
    while True:
        data = s.recv(1024)
        if not data:
            break
        recv_dec = data.decode('utf-8')
        buffer += recv_dec
        print(buffer)
except socket.timeout:
    print("超过5秒未收到新数据,结束接收")
finally:
    s.close()

内容的提问来源于stack exchange,提问作者BedSon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:01:36