Подключение ZeroMQ от браузера к серверу - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь заставить ZeroMQ работать в моем веб-приложении. В качестве внешнего интерфейса я использую библиотеку JSZMQ, которая должна работать в браузере (я знаю, что большинство библиотек этого не делают). На бэкэнде Python я использую zmq. Проблема в том, что все протоколы, которые я пробую, выдают ошибку. Если я попробую TCP, то, как и ожидалось, браузер выдаст ошибку «неподдерживаемый транспорт».

Согласно этот вопрос SO 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 как глобальный, поскольку он не сериализуем и не может быть передан в функции в качестве аргумента.

Почему это не работает?

1 Ответ

1 голос
/ 10 апреля 2020

Вы немного запутались здесь:

ws:// means http:// or default port 80
wss:// means https:// or default port 443

ws://<server>:<port> means http over that port.

В фоновом режиме происходит подключение браузера к серверу по протоколу http (s) и обновление подключения к веб-сокету, если это возможно.

Браузеры не допускают Raw соединений с сокетами, но 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]

В этой документации показано, как настроить единый файловый клиент веб-сокета и сервер FastAPI: https://fastapi.tiangolo.com/advanced/websockets/

Ваша работа будет выполняться между websocket.receive_text и websocket.send_text. * 103 7 *

@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.

Существует множество полезных функций, таких как Asyn c Базы данных, Instant OpenAPI Documentation и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...