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

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

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

炎炎设计 2019-04-17 11:09:19
一个简单的socket程序, 当client这边socket.close调用后,可以看到socket.isClosed()是为true。但是服务器端这边, server.accept() 得到的那个socket调用isClosed总是返回false。是否我在不借助心跳的情况下, server端无法仅通过api判断client掉线?我想了几种情况。如果client 最后调用了socket.close(), 那么server可以通过getInputStream.read() 读到-1.如果client,没有调用close, 直接通过小红点终止了程序, server端getInputStream.read()会报异常但是, 1的话, client发送一段流过来,没有关闭的话, server端读到最后也会读到-1. 所以-1不能判断连接的状态。 2的话,似乎可以判断连接断了,只要异常发生了。但是总感觉是异常控制了业务流程。不太规范。
查看完整描述

2 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-04-18
?
holdtom

TA贡献1805条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2019-04-18
  • 2 回答
  • 0 关注
  • 1308 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信