You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python实现服务器与客户端WebSocket通信时握手超时问题排查

Python实现服务器与客户端WebSocket通信时握手超时问题排查

看起来你遇到了WebSocket握手阶段的典型网络连通性问题,咱们一步步拆解排查,先定位问题再解决:


1. 先确认代码本身没问题(本地测试验证)

首先排除代码逻辑的问题:在服务器同一台机器上运行客户端,把连接地址改成ws://127.0.0.1:12348,如果能正常发送图片并收到服务器响应,说明你的代码逻辑完全没问题,问题出在跨机器的网络连通性上。


2. 核心问题:服务器IP与端口的连通性排查

握手超时90%以上是因为客户端无法成功连接到服务器的IP和端口,咱们逐个确认:

(1)服务器IP地址是否填写正确?

  • 如果你是同一局域网内的机器通信(比如笔记本和家里的另一台电脑):服务器的IP要填局域网内网IP(服务器上用ipconfig/ip a查看,格式一般是192.168.x.x10.x.x.x)。
  • 如果你是跨公网通信(比如服务器在云厂商,笔记本在家):服务器的IP要填公网IP(去云控制台查看,或者服务器上用curl ifconfig.me获取),绝对不能用内网IP。
  • 注意:绝对不要在跨机器时填127.0.0.1localhost,这两个只代表本机。

(2)端口12348是否对外开放?

这是最容易踩坑的点:

  • 服务器本地防火墙
    • Windows:打开「Windows Defender防火墙」→ 「高级设置」→ 添加入站规则,允许端口12348的TCP流量。
    • Linux:执行sudo ufw allow 12348/tcp(如果用ufw),或者配置iptables开放端口。
  • 云服务器安全组:如果是阿里云、腾讯云等云服务器,必须去控制台的「安全组」页面,添加入站规则,允许TCP 12348端口的所有IP(或指定你的客户端IP)访问。
  • 验证端口连通性:在客户端机器上执行telnet xxx.xxx.xx.xxx 12348(Windows需要先开启telnet功能),或者用nc -zv xxx.xxx.xx.xxx 12348(Linux/macOS),如果显示连接成功,说明端口通了;如果失败,继续排查防火墙/安全组。

3. 代码层面的优化(辅助排查)

如果网络连通性确认没问题,但还是超时,可以给客户端的连接加超时参数,同时简化测试逻辑:

(1)给客户端连接增加超时时间

修改客户端的连接代码,延长握手超时时间,避免因网络延迟导致的误判:

async with websockets.connect(
    "ws://xxx.xxx.xx.xxx:12348",
    open_timeout=15  # 延长到15秒超时
) as websocket:
    # 后续代码不变

(2)用纯文本测试排除图片编码干扰

先写一个极简的文本测试客户端,排除图片编码/读取的影响:

import asyncio
import websockets

async def test_text_connection():
    try:
        async with websockets.connect("ws://xxx.xxx.xx.xxx:12348", open_timeout=15) as websocket:
            await websocket.send("Hello Server!")
            response = await websocket.recv()
            print(f"Server reply: {response}")
    except TimeoutError:
        print("Handshake timeout - still can't connect to server!")
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    asyncio.run(test_text_connection())

如果这个文本客户端也超时,那100%是网络问题;如果能通,再回到图片发送的逻辑排查(比如图片读取是否成功、编码是否正常)。


4. 其他可能的小坑

  • 确认服务器程序真的在运行:服务器终端要显示Server running...,没有报错或闪退。
  • 如果你用了VPN、代理软件:暂时关闭,代理可能会拦截WebSocket的握手请求。
  • 客户端图片读取验证:在客户端代码里加一行判断,避免读取失败导致后续问题(虽然这不会导致握手超时,但可以排除后续逻辑问题):
frame = cv2.imread("temp.jpg")
if frame is None:
    print("Failed to read image file!")
    return

总结

按照这个流程排查,先本地验证代码正确性,再聚焦网络连通性(IP、端口、防火墙/安全组),基本就能解决握手超时的问题。如果还是有问题,可以告诉我你的网络场景(局域网/公网)、服务器类型(本地机器/云服务器),我再帮你细化排查!

火山引擎 最新活动