java Socket 程序server端调用isClosed为什么检测不到状态

发布于 2022-09-02 13:48:58 字数 517 浏览 10 评论 0

一个简单的socket程序, 当client这边socket.close调用后,可以看到socket.isClosed()是为true。
但是服务器端这边, server.accept() 得到的那个socket调用isClosed总是返回false。

是否我在不借助心跳的情况下, server端无法仅通过api判断client掉线?

我想了几种情况。

  1. 如果client 最后调用了socket.close(), 那么server可以通过getInputStream.read() 读到-1.

  2. 如果client,没有调用close, 直接通过小红点终止了程序, server端getInputStream.read()会报异常

但是, 1的话, client发送一段流过来,没有关闭的话, server端读到最后也会读到-1. 所以-1不能判断连接的状态。 2的话,似乎可以判断连接断了,只要异常发生了。但是总感觉是异常控制了业务流程。不太规范。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

就像说晚安 2022-09-09 13:48:59

-1为断开没有问题。isClosed不可靠的,例如拔掉client端网线的话,server端还是认为没有断开。要靠polling机制或者tcp的keepalive机制。

污味仙女 2022-09-09 13:48:59

client发送一段流过来,没有关闭的话, server端读到最后也会读到-1

这句话不对,没有关闭且一段数据读完的话继续read()应该是阻塞。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文