Подтвердить что ты не робот

Подпротокол запроса-ответа WebSocket

WebSocket обеспечивает двунаправленную связь, как будто человек разговаривает. Клиент может отправлять данные на сервер, а сервер может отправлять данные клиенту в любое время. Но как насчет поведения запрос-ответ? Клиент может что-то спросить у сервера и дождаться ответа. Кажется, что Websocket не предоставляет ничего, чтобы связать данные клиента (запрос) с данными сервера (ответ).

Это, вероятно, работа подпротокола, и у меня есть некоторые идеи о том, как это сделать (отправить идентификатор с запросом и дождаться ответа с тем же идентификатором в течение периода ожидания).

Чтобы не изобретать велосипед и сэкономить время, я искал в интернете существующее решение, но не нашел ничего связанного (возможно, с плохими ключевыми словами).

Итак, кто-нибудь знает об этой работе или я что-то упустил?

4b9b3361

Ответ 1

Протокол обмена сообщениями WebSocket (WAMP) http://wamp.ws/ предоставляет RPC (удаленный вызов процедур) и PubSub (публиковать и подписывать) шаблоны обмена сообщениями поверх исходного WebSocket для этой цели.

WAMP является надлежащим подпротокодом WebSocket, использует WebSocket в качестве транспорта и JSON в качестве формата полезной нагрузки. RPC реализуется с использованием 3 сообщений, и эти сообщения содержат "Идентификатор вызова" для корреляции ответов асинхронного RPC-сервера на вызовы процедур, инициированных клиентом.

Отказ от ответственности: я являюсь автором WAMP и некоторых (с открытым исходным кодом) WAMP-реализаций. Его открытая инициатива, а другие уже начали садиться на лодку. В конечном счете, должен быть WAMP RFC, правильно определяющий протокол, но он все еще находится на ранних стадиях.

Ответ 2

Я бы использовал JSON-RPC 2.0.

http://www.jsonrpc.org/specification

Каждое сообщение будет объектом JSON. В протоколе указано, является ли он вызовом, который хочет получить ответ (связь с идентификатором) или уведомление.

Приложение, поддерживающее JSON-RPC, может легко проверить, содержит ли объект сообщения метод, обозначающий вызов, или нет, что означает ответ.

Я собираюсь создать javascript lib для обработки json rpc через websocket, с ajax в качестве резервного...

Ответ 3

взгляните на SwaggerSocket, который является протоколом REST поверх WebSockets, поддерживаемым всем основным Java WebServer.

Ответ 4

Я запускаю простую программу запроса-ответа с помощью websockets. См. " демонстрация сервера Websocket". Вы можете загрузить исходный код веб-страницы.

Ответ 5

Взгляните на msg-rpc, он обеспечивает поддержку двунаправленной rpc через простой интерфейс сообщений, включая WebSocket.

Не только простой rpc, который может охватывать поведение "запрос клиента/сервера", он также поддерживает поведение "запрос сервера/клиента", которое выполняется через службу Rpc.

Чтобы начать работу, есть примеры sockjs и socket.io.

Ответ 6

  (отправьте идентификатор с запросом и дождитесь ответа с тем же идентификатором до истечения времени ожидания)

Я создал библиотеку, которая делает именно это, под названием WebSocketR2 (где R2 означает запрос ответа): https://github.com/ModernEdgeSoftware/WebSocketR2

Он также обрабатывает повторное подключение к серверу в случае потери соединения, что может быть полезно, если вы выполняете веб-сокеты через балансировщик нагрузки.

В конечном итоге вы можете реализовать обратные вызовы для функции отправки через веб-сокет следующим образом:

var request = {
    action: "login",
    params: {
        username: "test",
        password: "password"
    }
};

ws.send(request, function(response){
    console.log(response)
});

Ответ 7

Немного опоздал с этим обсуждением, но BrokerJS - это реактивная альтернатива, которую вы можете попробовать в NodeJS. Определите модель данных и подпишите подключения веб-сокетов к определенным ключам модели. Любые изменения в переменной на стороне сервера автоматически отражаются на стороне клиента. Я думаю, что это сэкономит вам много стандартного кода. Более того, вы все еще можете использовать старомодный обмен сообщениями через веб-сокет параллельно новому реактивному способу действий. Это далеко не полированный продукт, а массивы - это головная боль. Но в сочетании с чем-то вроде VueJS, React или Svelte, я думаю, это избавит вас от многих проблем.

Отказ от ответственности: я являюсь автором BrokerJS.