gpt4 book ai didi

Java套接字API : How to tell if a connection has been closed?

转载 作者:行者123 更新时间:2023-12-01 21:26:09 28 4
gpt4 key购买 nike

我在使用 Java 套接字 API 时遇到了一些问题。我正在尝试显示当前连接到我的游戏的玩家数量。很容易确定玩家何时已连接。然而,使用套接字 API 来确定玩家何时断开连接似乎不必要地困难。

在已远程断开连接的套接字上调用 isConnected() 似乎总是返回 true。同样,在已远程关闭的套接字上调用 isClosed() 似乎总是返回 false。我读过要实际确定套接字是否已关闭,必须将数据写入输出流并且必须捕获异常。这似乎是处理这种情况的一种非常不干净的方式。我们只能不断地通过网络发送垃圾消息才能知道套接字何时关闭。

还有其他解决办法吗?

最佳答案

没有 TCP API 可以告诉您连接的当前状态。 isConnected()isClosed() 告诉您套接字的当前状态。不是同一件事。

  1. isConnected() 告诉您是否已连接此套接字。你有,所以它返回 true。

  2. isClosed() 告诉您是否已关闭此套接字。直到关闭为止,它会返回 false。

  3. 如果对等方已有序地关闭连接

    • read() 返回 -1
    • readLine() 返回 null
    • readXXX() 对于任何其他 XXX 都会抛出 EOFException

    • 写入将抛出 IOException:“连接被对等方重置”,最终会受到缓冲延迟的影响。

  4. 如果连接因任何其他原因而断开,写入将抛出 IOException,最终如上所述,读取也可能会执行相同的操作。

    <
  5. 如果对等方仍处于连接状态但未使用该连接,则可以使用读取超时。

  6. 与您在其他地方读到的内容相反,ClosedChannelException 不会告诉您这一点。 [SocketException:套接字已关闭。也没有。]它只告诉您关闭了 channel ,然后继续使用它。换句话说,是您的编程错误。它并不表示连接已关闭。

  7. 在 Windows XP 上对 Java 7 进行一些实验的结果表明,如果:

    • 您正在选择OP_READ
    • select() 返回大于零的值
    • 关联的 SelectionKey 已无效 (key.isValid() == false)

    这意味着对等方已重置连接。然而,这可能是 JRE 版本或平台所特有的。

关于Java套接字API : How to tell if a connection has been closed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58832127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com