如何处理网络中断并克服它而不会丢失数据?

时间:2014-11-02 05:23:25

标签: java networking tcp real-time netty

我正在试验Netty,这是一个异步事件驱动的网络应用程序框架。在我的应用程序中,假设服务器和客户端正在聊天应用程序中相互发送消息。由于WiFi不可用,突然客户端与其网络断开连接。服务器不知道它,继续向客户端发送消息。但是客户无法接收这些。怎么办呢?从服务器发送的消息很重要。

2 个答案:

答案 0 :(得分:1)

您写道服务器发送的消息很重要。因此,我假设您要确保消息不仅到达客户端计算机,而且还由客户端应用程序显示/处理/存储。

即使您的服务器代码访问服务器端的TCP ACK信息,也只会告诉您数据是由客户端计算机的TCP堆栈处理的,而不是应用程序。客户端应用程序代码需要将确认发送到它已收到的服务器并处理该消息。如果服务器应用程序代码在一定时间内没有从客户端应用程序收到确认,则应重新传输该消息。这意味着客户端应用程序需要处理可能由于重新传输而产生的重复消息。它会通过发送一个确认然后删除该消息来实现。

答案 1 :(得分:1)

听起来你的问题有几个部分。

1)检测对等体何时断开连接。

https://stackoverflow.com/a/26520444/3993966

2)如何处理在被通知对方断开之前发送的数据。

这取决于应用程序,取决于您的要求。有许多不同的方法可以实现这一点,并且每种方法都有不同的复杂性。以下是每种方法的一些方法和一些简单的优点/缺点。

2.1)什么也不做。

如果它是用户到用户应用程序,那么假设用户将重新上线并询问他们错过了什么是可接受的权衡。

+简单

-依靠“聪明”的客户来弄清楚他们错过了什么

2.2)应用程序级别的消息确认。

服务器将保存所有应用程序消息,直到客户端确认已收到消息。

+您的客户将始终收到他们的消息

-每条消息的额外往返

-服务器必须为每个客户端维护额外状态

-服务器必须为每个客户端维护一个未确认消息的队列(可能必须缓存到磁盘以避免内存不足,可能需要超时数据,存储策略可能会变得复杂)

-必须能够跨套接字连接唯一标识客户端(以传递任何“未接收”消息)

-如果您的应用程序是点对点聊天,则可能需要第三方(例如谷歌聊天)来扮演服务器角色(或者通常在其他方面更复杂)。