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
相关产品推荐
相关产品推荐

