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

JS连接pyzmq搭建的WebSocket报错连接被拒的原因及解决方法

错误原因

  • 直接触发原因:ZMQ服务端角色配置错误。你作为数据发布的服务端,调用了connect()方法而非bind()方法,connect()是主动连接已存在的监听端口,当前1161端口没有任何程序监听,所以连接直接被拒绝。
  • 根本原因:协议不兼容。你使用的原生ZMQ TCP Socket和JS端的WebSocket是完全不同的通信协议,原生ZMQ的TCP传输不支持WebSocket的握手流程、帧封装格式,就算端口正常监听,JS WebSocket也无法正常建立连接。
  • 其他可能原因:1161端口被其他程序占用,或者系统防火墙拦截了该端口的入站请求。

解决方法

方案1:替换Python侧为标准WebSocket服务(兼容性最好,实现最简单)

直接放弃ZMQ,使用Python的WebSocket库搭建服务,和JS端的WebSocket天然兼容。示例代码参考:

import asyncio
import cv2
import base64
import websockets

async def transmit(websocket):
    camera = cv2.VideoCapture(0)
    while True:
        grabbed, frame = camera.read()
        if not grabbed:
            break
        frame = cv2.resize(frame, (640, 480))
        encoded, buffer = cv2.imencode('.jpg', frame)
        jpg_as_text = base64.b64encode(buffer)
        await websocket.send(jpg_as_text)
        await asyncio.sleep(0.05)

async def main():
    async with websockets.serve(transmit, "0.0.0.0", 1161):
        await asyncio.Future()

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

需要先安装依赖:pip install websockets opencv-python,JS侧代码无需修改即可正常连接。

方案2:使用ZMQ的WebSocket传输支持(ZMQ 4.2+版本支持)

如果必须保留ZMQ的pub/sub架构,可以使用ZMQ内置的WebSocket传输能力,修改Python侧代码两处即可:

  1. 将footage_socket.connect('tcp://192.168.1.15:1161')改为footage_socket.bind('ws://0.0.0.0:1161')
  2. 确认你的pyzmq是编译时开启了WebSocket支持的版本,可执行pip install --upgrade pyzmq更新到最新版。
    修改完成后JS侧WebSocket可以正常识别ZMQ的ws服务。

方案3:Electron端直接使用ZMQ客户端(协议完全对齐)

Electron环境可以安装ZMQ的JS绑定,直接用SUB模式连接Python的PUB socket,不需要用到WebSocket:

  1. 先修改Python侧代码:将footage_socket.connect('tcp://192.168.1.15:1161')改为footage_socket.bind('tcp://0.0.0.0:1161')
  2. Electron项目安装依赖:npm install zeromq
  3. 替换JS侧代码的WebSocket逻辑为ZMQ SUB逻辑:
const zmq = require("zeromq")
const { ipcRenderer } = require("electron");

async function run() {
  const sock = new zmq.Subscriber
  sock.connect("tcp://192.168.1.15:1161")
  sock.subscribe("")
  for await (const [msg] of sock) {
    // msg就是接收到的base64编码的图片数据,自行处理即可
    console.log(msg.toString())
  }
}

document.addEventListener('DOMContentLoaded', (e) => {
    ipcRenderer.send('userInfo');
    run()
});

通用检查项

不管使用哪种方案,都需要确认:

  • 1161端口没有被其他程序占用,可使用netstat -ano | findstr 1161(Windows)或ss -tulpn | grep 1161(Linux/macOS)检查
  • 运行Python服务的设备防火墙开放了1161端口的入站规则
  • JS侧填写的IP地址是Python服务设备的正确局域网IP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:15:00