日期:2014-05-20  浏览次数:20984 次

服务器端Socket连接close后,客户端Socket.isClosed()为何还是false
服务器端Socket连接关闭后,就是调用Socket.close(),好像在客户端调用socket.isClosed()方法还是false,理论上应该是true才对,还有同样情况,客户端调用Socket.isConnected()也是true,我觉得也应该为false才对。
是否要
Java code
Socket.shutdownInput();
Socket.shutdownOutput();
Socket.close();

才能正真的达到关闭的效果呢?

------解决方案--------------------
Socket.close();并不是真正意义上关闭,由于流还依然在缓存中,只有等到缓存全部清楚后才会真正的去关闭。


------解决方案--------------------
先调用socket.getInputStream().close()

socket.close()

然后socket的isClosed()

先关闭流然后再关闭socket

------解决方案--------------------
有默认等待的时间,close方法不能立即关闭
------解决方案--------------------
参考这个文章:
http://www.w3china.org/blog/more.asp?name=hongrui&id=24039
------解决方案--------------------
5楼正解.
------解决方案--------------------
isClosed()方法是判断客户端是否已经调用过close()方法了。这个方法并不是判断服务端是否已经断开连接了
怎样判断服务端已经断开了连接的方法,我这里还没有。

但是,在服务器端已经断开连接的情况下,IO操作会抛出异常的。当然,如果要非阻塞的判断服务器端是否断开连接,

楼主试试InputStream.available()这个方法吧。具体我也没试过,看看返回值,有没有-1的情况
------解决方案--------------------
探讨
非阻塞的可能可以,但在阻塞方式下,无论服务器端是否socket is closed,InputStream.available() 的值一直为0,我觉得应该这样实现,在服务器端要关闭socket连接前,先发个密文给客户端,然后close这个sockey,客户端收到关闭socket的密文,则也close,也就是说,两边通过密文来同步。不知合理否?

------解决方案--------------------
UDP通信要连接啊,不用这么操心吧?
------解决方案--------------------
结束了一方通信就行了