正在将ZeroMQ从浏览器连接到服务器



我正在尝试让ZeroMQ在我的web应用程序中运行。在前端,我使用的是JSZMQ库,它应该在浏览器中工作(我知道大多数库都不工作(。在Python后端,我使用的是zmq。问题是我尝试的所有协议都抛出了一个错误。如果我尝试TCP,正如预期的那样,浏览器会抛出一个错误,说";无支撑运输";。

根据这个SO问题,当协议是";ws://";。当我尝试这个时,服务器抛出一个";不支持协议";运行时立即出错。这是我的代码:

客户:

import * as zmq from 'jszmq'
const socket = new zmq.Pull()
socket.connect('ws://127.0.0.1:3000')
socket.on('message', msg => console.log(msg))

服务器:

import zmq
context = zmq.Context()
sock = context.socket(zmq.PUSH)
sock.bind('ws://127.0.0.1:3000') # This is what throws the error
sock.send('hello')

如果重要的话,我将为服务器进行多处理,将zmq对象作为全局对象,因为它不可序列化,也不能作为参数传递到函数中。

为什么不起作用?

您在这里有点困惑:

ws:// means http:// or default port 80
wss:// means https:// or default port 443
ws://<server>:<port> means http over that port.

后台发生的情况是,浏览器通过http(s(协议连接到服务器,并在可能的情况下将连接升级到websocket。

浏览器不允许Raw套接字连接,但允许Websocket连接。

看看https://github.com/zeromq/jszmq#compatibility-带zeromq:

与ZeroMQ的兼容性

WebSocket传输最近添加到zeromq,并且它仅可用从源代码编译时。

zeromq的其他端口,如NetMQ(C#(和JeroMQ(Java(还没有支持WebSocket传输。

您必须了解FastAPI Python框架。

你正在寻找的模式是:

[SOCKET CLIENT] --> [FASTAPI SERVER] <--> [ZEROMQ]

本文档展示了如何在单个文件客户端websocket和FastAPI服务器中进行设置:https://fastapi.tiangolo.com/advanced/websockets/

您的工作将在websocket.rereceive_text和websocket.send_text之间完成。

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
# --> ZeroMQ Code Here <--
await websocket.send_text(f"Message text was: {data}")

这个框架非常棒,您可以利用本机后台任务获得更多优势:https://fastapi.tiangolo.com/tutorial/background-tasks/

所以,您可以接受来自客户端的消息,并在某个ZeroMQ工作人员完成后发送回。

还有很多功能也很有用,比如异步数据库、即时OpenAPI文档等等

最新更新