socket服务端接收客户端数据跳出while循环后代码无法继续执行
问题根因
你当前服务端卡住的核心原因是recv()方法默认处于阻塞模式:
只有当客户端主动断开TCP连接时,conn.recv(2048)才会返回空字节串,触发if not data: break的逻辑跳出内层循环。你现在的场景里客户端发完2条签名后既没有主动关闭连接,也没有继续发送新数据,服务端的recv()就会一直挂起等待数据,根本没有执行到break语句,自然不会打印后续的test2、test3。
解决方案
可以根据你的业务场景二选一:
- 调整客户端逻辑:发送完全部签名数据后,主动调用
socket.close()关闭连接,此时服务端会立即收到空数据触发break,继续执行后续逻辑 - 约定数据传输边界:如果需要复用TCP连接不能直接关闭,就提前和客户端约定传输规则,避免服务端无限等待:
- 固定长度传输:每条签名固定大小,服务端读够对应长度就认为本条签名接收完成,收到约定数量的签名后直接跳出内层循环
- 特殊分隔符标识:约定PGP签名中不会出现的字符串(比如
---END OF SIGNATURE---)作为结束标识,服务端接收到数据后缓存拼接,检测到结束标识就跳出循环 - 长度前置传输:发送签名前先传4字节的内容长度,服务端先读取长度值,再读对应长度的内容,全部读取完成后跳出循环
额外代码优化建议
- 你当前打开输出文件用的是
w覆盖模式,每次新客户端连接都会清空之前的签名记录,如果需要累加历史签名请改用a追加模式 - 建议用
with语句管理文件句柄和socket连接,避免资源泄漏,示例调整如下:
while True: conn, addr = server.accept() print("Connected successfully") directory = "(Hidden for question)" # with语句自动管理文件关闭 with open(f"{directory}\\signatures.txt", "a", encoding="utf-8") as outputFile: while True: data = conn.recv(2048) if not data: break print("test") outputFile.write(data.decode()+"\n") outputFile.flush() print("test2") conn.close() print("test3")
内容的提问来源于stack exchange,提问作者Leinad482
相关产品推荐
相关产品推荐

