簡體   English   中英

將 ZeroMQ 從瀏覽器連接到服務器

[英]Connecting ZeroMQ from browser to server

我正在嘗試讓 ZeroMQ 在我的 Web 應用程序中工作。 在前端,我使用的是應該在瀏覽器中工作的 JSZMQ 庫(我知道大多數庫都沒有)。 在 Python 后端,我使用的是 zmq。 問題是我嘗試的所有協議都拋出錯誤。 如果我嘗試 TCP,正如預期的那樣,瀏覽器會拋出一個錯誤,指出“不支持的傳輸”。

根據這個 SO question JSZMQ 應該在協議是“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。

瀏覽器不允許原始套接字連接,但允許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 文檔等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM