为了账号安全,请及时绑定邮箱和手机立即绑定

JavaSocketAPI:如何判断连接是否已关闭?

JavaSocketAPI:如何判断连接是否已关闭?

弑天下 2019-06-19 19:42:10
JavaSocketAPI:如何判断连接是否已关闭?我在JavaSocketAPI中遇到了一些问题。我正在尝试显示当前连接到我的游戏中的玩家数量。这是很容易确定何时球员已经连接。但是,要确定播放机何时使用套接字API断开连接似乎是不必要的困难。呼叫isConnected()在断开远程连接的套接字上,似乎总是返回。true..同样,调用isClosed()在远程关闭的套接字上,似乎总是返回。false..我已经读过,要实际确定是否关闭了套接字,必须将数据写入输出流,并且必须捕获异常。这似乎是处理这种情况的一种非常不干净的方法。我们必须不断地通过网络垃圾邮件才能知道套接字何时关闭。还有别的解决办法吗?
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

没有TCP API可以告诉您连接的当前状态。isConnected()isClosed()告诉你当前的状况你的插座..不是一回事。

  1. isConnected()告诉你是否你,你们已连接这个插座..你有,所以它会返回真。

  2. isClosed()告诉你是否你,你们已关闭这个插座。在你找到之前,它会返回假的。

  3. 如果同侪已关闭连接有条不紊地

    • read()

      报税表-1
    • readLine()

      回报

      null

    • readXXX()抛出EOFException任何其他XXX。

    • 一次书写就会抛出一个IOException:“由对等方重置连接”,最终会受到缓冲延迟的影响。

  4. 如果连接由于任何其他原因而中断,则写入将引发IOException,最终,就像上面一样,读可能会做同样的事情。

  5. 如果对等方仍然连接但不使用连接,则可以使用读取超时。

  6. 与你在其他地方读到的相反,ClosedChannelException不会告诉你这个。[也不是SocketException: socket closed.它只告诉你你,你们关闭频道,然后继续使用。换句话说,您的编程错误。它并不表示已关闭。连接。

  7. 由于在WindowsXP上对Java 7进行了一些实验,因此,如果:

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

    • 你在选择

      OP_READ

    • select()

      返回大于零的值。
    • 相关联

      SelectionKey

      已经无效(

      key.isValid() == false)


查看完整回答
反对 回复 2019-06-19
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我看到了刚刚发布的另一个答案,但我认为你和客户在玩你的游戏是互动的,所以我可能会提出另一种方法(而BufferedReader在某些情况下肯定是有效的)。

如果你想.。您可以将“注册”责任委托给客户。也就是说,您将拥有一组连接的用户,在最后一条消息上有一个时间戳,该时间戳来自每个.如果客户端超时,您将强制重新注册客户端,但这将导致以下引用和想法。

我已经读过,要实际确定套接字是否已关闭,必须将数据写入输出流,并且必须捕获异常。这似乎是处理这种情况的一种非常不干净的方法。

如果您的Java代码没有关闭/断开套接字,那么如何通知您远程主机关闭了您的连接?最终,尝试/捕捉所做的事情与侦听实际套接字上的事件的计票程序所做的事情大致相同。考虑以下几点:

  • 您的本地系统可以在不通知您的情况下关闭您的套接字。这只是套接字的实现(也就是说,它不轮询硬件/驱动程序/固件/任何状态更改)。
  • 新套接字(代理p).。有多个缔约方(实际上有6个端点)可能会关闭您的连接.

我认为抽象语言的一个特点是你是从细节中抽象出来的。想想SqlConnection的C#中的Using关键字(尝试/最后),或者什么的.只是做生意的成本.。我认为,尝试/捕捉/最终是套接字使用的公认和必要的模式。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 1958 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号