2013-04-29 65 views
0

我正在创建客户端 - 服务器系统,应该能够在ustable网络中工作。它假定一次可以断开连接,然后系统必须重新连接并继续工作。我使用Netty并且遇到了问题:我们如何知道我们发送的邮件已被另一主机接收?TCP Netty确保收到消息

我在想,为了这个目的的ChannelFuture可以使用,我可以简单地尝试,如果它在连接未来听者无法再次发送消息:

ChannelFuture fut = channel.write(message); 
fut.addListener(new ChannelFutureListener() { 
     @Override 
     public void operationComplete(ChannelFuture future) throws Exception { 
      if (!future.isSuccess()) { 
       LOGGER.error("Message send failed. Message: " + message, future.getCause()); 
       //Queue message to be send after reconnect 
      } 
     } 
}); 

但是当我做,我注意到,该监听器从不打印错误。 (我从网络unpluging当系统几乎不起作用测试这个) 此外,我注意到,所有期货交易的消息,这是我送,进入“完成”状态并没有办法不保证邮件收到(不使用确认消息)

我所知,可能会收到的TCP协议的担保信息,并与它一起工作时,我们就可以知道哪个送包到达目的地,并且没有。我不能相信Netty不允许知道它。

有没有一种很好的方法来知道该消息已交付?

回答

2

您误解了TCP。 TCP不保证收到您的消息。它提供了一个可靠的,有序的字节流。它不知道有关您的信息的任何信息,也无法告诉您何时它已被远程主机收到。因此Netty也不能。 Netty只能告诉你,你的消息在被传输之前已经写入了操作系统缓冲区。这是你的代码正在检测的内容。

为确保您的信息已经收到,接收器必须发回一个明确的确认。达到此目的的最佳方式取决于协议的预期行为,但通常涉及维护已发送但尚未确认的所有消息的表格。

+0

TCP确实保证,如果消息(或其对应的字节)被写入TCP套接字,则该信息(或它的字节)将最终传递到客户端套接字。它可能不知道应用程序级别的消息,但它确实保证消息传递。如果网络或物理层导致无法解决的问题,那么它将至少通知发送套接字失败的消息。 – Bhaskar 2017-08-30 19:16:36

0

所有你的未来确实是写邮件到网络。

为了保证了接待您必须执行确认或使用消息数和重发请求。