[英]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.