Web Socket - Spring:确认收到的消息

Posted

技术标签:

【中文标题】Web Socket - Spring:确认收到的消息【英文标题】:Web Socket - Spring : Confirm of message received 【发布时间】:2015-04-07 11:53:09 【问题描述】:

我通过带有 Spring 的 WebSocket 从 Tomcat 服务器向 SockJSClient 发送消息,方法如下:

WebSocketSession.sendMessage(WebSocketMessage<?> message)

我想知道何时收到消息(最终带有补充信息,例如客户端上的逻辑是否成功处理),然后转到下一条消息。

这是一个解释用例的活动图。

我怎样才能收到客户的接收确认或结果?

【问题讨论】:

这个重复:***.com/questions/29120943/… 在这种情况下能否提供一个实现的例子? 看看 Stomp,它是一个具有多种语言实现的协议(stomp js 是 javascript 库),它提供了这些功能。 【参考方案1】:

正如 Erwin 所指出的,您可以采用一些更高的协议来提供诸如 STOMP 之类的功能。但是,如果您害怕仅针对该功能采用它,您可以自己实现该功能。

第一件事是给每条消息id标识每条消息,type识别每条消息的目的,data传输消息的内容,reply是一个标志,看是否或不需要 ACK 并使用 JSON 之类的格式将包含这些数据的对象序列化/反序列化到 WebSocket 消息中。 发送消息时,它通过为该消息发出一个新的id 创建一个对象,将type 设置为message,将data 设置为给定消息,将reply 设置为true(如果需要ACK)或false 如果不是。并将其序列化为 JSON 并将其作为 WebSocket 消息发送。 - https://github.com/cettia/cettia-protocol/blob/1.0.0-Alpha1/lib/server.js#L88-L110 收到消息时,将JSON反序列化为上述对象。如果replytrue,它会发送一条特殊消息,其typereply,将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
);

【讨论】:

以上是关于Web Socket - Spring:确认收到的消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Web Socket RabbitMQ 不可用

Spring Web Socket - 从 MQ 监听器通知客户端

Spring boot、javascript 和 web socket 的 CORS 错误

tcp socket

socket通信4次挥手

TCP滑动窗口协议