如何使用websocket检查是否真的在Netty中传递了一条消息?

时间:2014-03-14 02:33:44

标签: java websocket timeout client-server netty

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

1 个答案:

答案 0 :(得分:1)

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

至于承认,Netty没有提供标准的内容,但实施起来并不困难。首先,每条消息都需要通过某种标识符进行唯一标识,可能是序列号,但全局唯一标识符意味着您可以跨越断开连接进行恢复。然后,您要创建一个实现ChannelInboundHandler和ChannelOutboundHandler的组合处理程序(假设为Netty 4)。发送消息时

  • 将邮件添加到由其ID
  • 索引的地图中
  • 创建与消息ID关联的计时器。将其添加到由消息ID
  • 索引的另一个地图中
  • 转发消息

当收到ACK时取消定时器并从各自的地图中删除定时器和消息。如果定时器触发使用相关的id来决定如何处理定时器和消息(可能重新传输并重置定时器)。

Netty提供了一个HashedWheelTimer,可以高效地管理大量适合此类活动的分辨率的计时器。

您可能还需要考虑对重试次数设置限制,以便您可以停止并引发错误,而不是无限期地继续。