【问题标题】:How to handle network disruption and overcoming it without losing data?如何在不丢失数据的情况下处理和克服网络中断?
【发布时间】:2014-11-02 05:23:24
【问题描述】:

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

【问题讨论】:

  • 发送者会得到一个 IOException: connection reset finally.

标签: java networking tcp real-time netty


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    1) 检测对端何时断开。

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

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

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

    2.1) 什么都不做。

    如果是用户对用户的应用程序,那么假设用户会重新上线并询问他们错过了什么可能是一个可以接受的权衡。

    +简单

    -依靠“聪明”的客户找出他们错过了什么

    2.2) 应用层消息确认。

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

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

    - 每条消息都有额外的往返

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

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

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

    - 如果您的应用程序是点对点聊天,则可能需要第三方(例如 google chat)充当服务器角色(或者通常以其他方式更复杂)。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2020-02-21
      • 1970-01-01
      • 2023-03-25
      • 2017-04-07
      • 1970-01-01
      • 2021-09-12
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多