【问题标题】:Connection between client and server doesn't end客户端和服务器之间的连接没有结束
【发布时间】:2011-12-21 03:24:58
【问题描述】:

我有一个 Java 服务器。客户端通过 TCP 连接到服务器。这是我的问题的情况: 1- 2 个客户端连接到服务器(客户端 a 和客户端 b) 2-客户端与服务器通信 3-“客户端a”与互联网断开连接 4-客户端a的socket连接没有断开 5-当“客户端a”再次连接到互联网时,“客户端a”可以在不连接服务器的情况下向服务器发送消息。

我希望当“客户端 a”与互联网断开连接时,服务器和“客户端 a”之间的连接会结束。

您对此有什么意见吗?

【问题讨论】:

  • 这到底是什么意思:“当“客户端a”再次连接互联网时,“客户端a”可以在不连接服务器的情况下向服务器发送消息。”
  • 首先客户端断开与互联网的连接,然后再次连接到互联网。客户端连接到互联网后,客户端和服务器之间没有打开新的套接字。它的行为就像旧的套接字连接没有关闭(我认为实际上它没有关闭)。因此客户端可以向服务器发送消息,因为它永远不会与服务器断开连接。清楚了吗?
  • 是的,这很清楚。那为什么会有问题呢?最初的连接从未中断,也没有人采取任何行动来中断它。如果您想检测断开连接并通过断开连接来做出响应,即使该连接可以在断开连接后继续存在,您也可以这样做。但这不是大多数人想要的,所以这不是默认行为。编写你想要的代码。
  • 这是个问题,因为有很多客户端连接到服务器,如果有任何客户端断开连接,我必须通知其他客户端
  • 那你需要写一些代码来实现客户端断线检测。您是在实现自己的协议还是这是一个记录在案的协议?它是否指定如何检测客户端断开连接?例如,查看RFC1459 section 4.6.2 了解 IRC 是如何做到的。

标签: java tcp


【解决方案1】:

有意见和有解决方案是两件不同的事情:-)

我建议在服务器端为您的连接添加一个 keepalive 超时。每隔(几秒?几分钟?)发送一次保持活动,如果没有保持活动响应,则终止服务器端的连接。

【讨论】:

  • 是的,你是对的,实际上我需要解决方案(:我想用你的答案澄清一些事情。你告诉我在服务器端实现某事每隔几秒发送一个保持活动请求,如果有是没有响应此请求,这意味着客户端不再连接到服务器。对吗?这是某种从服务器 ping 客户端的方式。对吗?
  • 是的,就是这样。如果你没有得到回应,杀了它。
【解决方案2】:

当机器与 Internet 断开连接时,它无法通过 Internet 发送任何数据。这包括发送关闭或中止连接所需的数据包。因此,如果断开连接,客户端将无法关闭连接。如果需要这样做,服务器必须这样做。如果你需要这种能力,应用协议必须提供它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2010-12-25
    • 2017-05-25
    • 2012-04-24
    • 1970-01-01
    • 2016-07-21
    • 2015-01-19
    相关资源
    最近更新 更多