Подпротокол запроса-ответа WebSocket
WebSocket обеспечивает двунаправленную связь, как будто человек разговаривает.
Клиент может отправлять данные на сервер, а сервер может отправлять данные клиенту в любое время.
Но как насчет поведения запрос-ответ?
Клиент может что-то спросить у сервера и дождаться ответа.
Кажется, что Websocket не предоставляет ничего, чтобы связать данные клиента (запрос) с данными сервера (ответ).
Это, вероятно, работа подпротокола, и у меня есть некоторые идеи о том, как это сделать (отправить идентификатор с запросом и дождаться ответа с тем же идентификатором в течение периода ожидания).
Чтобы не изобретать велосипед и сэкономить время, я искал в интернете существующее решение, но не нашел ничего связанного (возможно, с плохими ключевыми словами).
Итак, кто-нибудь знает об этой работе или я что-то упустил?
Ответы
Ответ 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.