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侧代码两处即可:
- 将
footage_socket.connect('tcp://192.168.1.15:1161')改为footage_socket.bind('ws://0.0.0.0:1161') - 确认你的pyzmq是编译时开启了WebSocket支持的版本,可执行
pip install --upgrade pyzmq更新到最新版。
修改完成后JS侧WebSocket可以正常识别ZMQ的ws服务。
方案3:Electron端直接使用ZMQ客户端(协议完全对齐)
Electron环境可以安装ZMQ的JS绑定,直接用SUB模式连接Python的PUB socket,不需要用到WebSocket:
- 先修改Python侧代码:将
footage_socket.connect('tcp://192.168.1.15:1161')改为footage_socket.bind('tcp://0.0.0.0:1161') - Electron项目安装依赖:
npm install zeromq - 替换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
相关产品推荐
相关产品推荐

