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

socket服务端接收客户端数据跳出while循环后代码无法继续执行

问题根因

你当前服务端卡住的核心原因是recv()方法默认处于阻塞模式:
只有当客户端主动断开TCP连接时,conn.recv(2048)才会返回空字节串,触发if not data: break的逻辑跳出内层循环。你现在的场景里客户端发完2条签名后既没有主动关闭连接,也没有继续发送新数据,服务端的recv()就会一直挂起等待数据,根本没有执行到break语句,自然不会打印后续的test2、test3。

解决方案

可以根据你的业务场景二选一:

  • 调整客户端逻辑:发送完全部签名数据后,主动调用socket.close()关闭连接,此时服务端会立即收到空数据触发break,继续执行后续逻辑
  • 约定数据传输边界:如果需要复用TCP连接不能直接关闭,就提前和客户端约定传输规则,避免服务端无限等待:
    1. 固定长度传输:每条签名固定大小,服务端读够对应长度就认为本条签名接收完成,收到约定数量的签名后直接跳出内层循环
    2. 特殊分隔符标识:约定PGP签名中不会出现的字符串(比如---END OF SIGNATURE---)作为结束标识,服务端接收到数据后缓存拼接,检测到结束标识就跳出循环
    3. 长度前置传输:发送签名前先传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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:06