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

时间:2020-03-28 22:25:38

标签: javascript python multiprocessing zeromq

我正在尝试让ZeroMQ在我的Web应用程序中正常工作。在前端,我使用的是JSZMQ库,该库应该在浏览器中工作(我知道大多数库都不行)。在Python后端,我正在使用zmq。问题是我尝试的所有协议都抛出错误。如果我尝试使用TCP,如预期的那样,浏览器将抛出一个错误消息,提示“不支持的传输”。

根据this SO question,当协议为“ ws://”时,JSZMQ应该可以工作。当我尝试此操作时,服务器在运行它时立即引发“不支持协议”错误。这是我的代码:

客户:

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对象作为全局对象,因为它不可序列化并且不能作为参数传递给函数。

为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

您在这里有些困惑:

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。

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

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

与ZeroMQ的兼容性

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

zeromq的其他端口(如NetMQ(C#)和JeroMQ(C#))尚未出现 支持WebSocket传输。

您必须看一下FastAPI Python Framework

您要寻找的模式是:

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

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

您的工作将在websocket.receive_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文档等。

相关问题