java - 如何使用 websocket 检查消息是否真的在 Netty 中传递?

标签 java websocket timeout client-server netty

我正在使用 Netty 开发一个 websocket 应用程序。我想知道消息是否真的从源发送到目的地。特别是,我们假设客户端和服务器有一个开放的 channel 并暂时交换一些消息。在某个时刻,客户端出现故障,但 Netty 中的 channel 仍然处于 Activity 状态。我尝试在发送消息之前使用 isReachable() ,但是这个方法在某些场景下似乎有 bug(例如,Win7 的机器已启动,但 isReachable() 返回 false)。现在,我的想法是实现一种使用 ACK 的机制,即服务器发送消息,客户端发回 ack。为此,我需要一个超时来查看在一定时间间隔后,相应的确认是否没有到达。 Netty中有类似的东西吗?

最佳答案

关于 isReachable() - 它只是一个尽力而为的 API。文档指出,它尝试发送 ICMP 回显请求或创建到目标主机上端口 7 的 TCP 连接,这两种操作都很有可能被防火墙阻止。您的情况是否发生这种情况?

至于承认,Netty 中没有任何内容将此作为标准,但实现起来应该不会太困难。首先,每条消息都需要通过某种标识符来唯一识别,可能是序列号,但全局唯一标识符意味着您可以在断开连接时恢复。然后您想要创建一个实现 ChannelInboundHandler 和 ChannelOutboundHandler 的组合处理程序(假设 Netty 4)。发送消息时

  • 将消息添加到按其 ID 索引的 map
  • 创建与消息 ID 关联的计时器。将其添加到按消息 ID 索引的另一个 map
  • 转发消息

当收到 ACK 时,取消计时器并从各自的映射中删除计时器和消息。如果计时器触发,请使用关联的 ID 来决定如何处理计时器和消息(可能重新传输并重置计时器)。

Netty 提供了一个 HashedWheelTimer,用于有效管理大量计时器,其分辨率适合此类 Activity 。

您可能还需要考虑限制重试次数,以便您可以停止并提出错误,而不是无限期地持续下去。

关于java - 如何使用 websocket 检查消息是否真的在 Netty 中传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395095/

相关文章:

java - struts 2中如何避免页面超时?

递归函数的Javascript settimeout?

java - 在 Windows 7 上模拟套接字连接重置/超时

java - org.apache.commons.fileupload.FileUploadException : the request was rejected because no multipart boundary was found

java - SwingUtilities.invokeLater、SwingWorker 和 gif 图标动画问题

Haskell IO 与 Websockets

websocket - 如何从客户端触发 websocket 帧碎片?

java - 在 for 循环中存储值?

Java - 如何使用Gson解析json文件

java - 如何使用 Spring Boot RSocket 服务器支持 WebSocket 传输?