【问题标题】:Detecting client disconnection in tcp在 tcp 中检测客户端断开连接
【发布时间】:2014-01-24 16:20:30
【问题描述】:

我正在使用 tcp 套接字编写服务器/客户端应用程序,我的问题是如何检测半开连接,我打算使用 keep-alive 但有些人建议我做自己的协议,所以我现在计划是:

在服务器端:
服务器将等待 10 秒让客户端发送一些数据,如果服务器在给定时间内没有收到来自客户端的任何消息,则服务器会将客户端标记为断开连接,否则,如果服务器收到来自客户端的消息客户端它将再次重置计时器。

在客户端:
客户端将每 10 秒发送一次消息,但如果服务器向客户端请求一些数据(例如,如果计数器在 5 秒内,并且客户端向服务器发送一些数据),客户端中的计时器将再次重置为 0。

简而言之,协议将在收到最后一条消息后从 0 计数到 10 以关闭连接。

我现在的问题是,这样可以吗?还是我做错了?或者这是一个坏主意?还是我会在客户端和服务器上遇到任何问题/错误?或者我的连接会被防火墙、nat 等阻止吗?

谢谢。

【问题讨论】:

    标签: tcp


    【解决方案1】:

    您可以在套接字上设置一个超时,但最好实现您自己的协议以保持活动状态。但是,您不需要自己维护计数器。另外,你最好将超时时间设置为保持活动间隔的两倍,所以如果你的超时时间是 10 秒,你应该至少每 5 秒发送一次保持活动

    【讨论】:

      【解决方案2】:

      这样好吗?

      是的。

      还是我做错了?

      是的。您不需要维护自己的计时器,重置它等。只需使用Socket.setSoTimeout().,它会在您每次调用read()时自动从零开始,如果超时则抛出SocketTimeoutException

      还是一个坏主意?

      这是一个好主意,但是当Socket 已经支持它时,您正在尝试自己实现。

      或者我会在客户端和服务器上遇到任何问题/错误吗?

      当读取时超时到期时,您将遇到SocketTimeoutException,如果这导致您关闭套接字,则任何后续发送到套接字最终都会得到一个IOException: connection reset,,您必须正确处理它,即关闭在那一端的套接字并忘记了那个对等点。

      或者我的连接会被防火墙、nat 等阻止吗?

      使用读取超时对防火墙或 NAT 没有额外影响。

      【讨论】:

      • 感谢答案,我还有一个问题,如果我使用这种方式来检测客户端断开连接,如果我有很多客户端,会不会给服务器带来压力/使用大量资源?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      相关资源
      最近更新 更多