我使用 Spring 通过 WebSocket 从 Tomcat 服务器向 SockJSClient 发送消息,方法如下:
WebSocketSession.sendMessage(WebSocketMessage<?> message)
并且我想知道何时收到消息(最终带有补充信息,例如客户端上的逻辑是否成功处理),然后转到下一条消息。
这是解释用例的 Activity 图。
我如何收到客户的接收或结果确认?
最佳答案
正如 Erwin 指出的,您可以采用一些提供此类功能的更高协议(protocol),例如 STOMP。但是,如果您害怕仅针对该功能采用它,您可以自己实现该功能。
- 第一件事是给每条消息
id
来识别每条消息,type
来识别每条消息的目的,data
来传输消息的内容和reply
,这是一个标志,用于查看是否需要 ACK 并使用 JSON 等格式将包含这些数据的对象序列化到 WebSocket 消息中或从 WebSocket 消息中反序列化。 - 发送消息时,它会通过为该消息发出新的
id
来创建一个对象,并将type
设置为message
和data
到给定消息,如果需要 ACK,则reply
为true
,如果不需要,则为false
。它将其序列化为 JSON 并将其作为 WebSocket 消息发送。 -https://github.com/cettia/cettia-protocol/blob/1.0.0-Alpha1/lib/server.js#L88-L110 - 当接收到消息时,它会将 JSON 反序列化为上述对象。如果
reply
为true
,则发送一条type
为reply
设置data
的特殊消息> 到该消息的id
。然后,对方可以确认对方已收到一条id为id
的消息。 -https://github.com/cettia/cettia-protocol/blob/1.0.0-Alpha1/lib/server.js#L46-L76
以上链接指向 Cettia 中的类似实现这是我写的一个实时Web应用程序框架。尽管该实现有点复杂,因为它旨在允许用户处理带有结果的回调,但您可能会明白基本的想法。
该链接实现的 API 如下所示。
需要事件处理结果的服务器或客户端。
// Using Java server with lambda
socket.send("foo", "bar", result -> /* resolved */, reason -> /* rejected */);
负责提交结果的相应客户端或服务器。
// Using JavaScript client with arrow functions
socket.on("foo", (data, reply) => {
// data is 'bar'
// 'reply.resolve(result)' if it successes
// 'reply.reject(reason)' if it fails
});
关于java - Web Socket - Spring : Confirm of message received,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490945/