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

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【jiangguilong2000】截止到2008-07-29 12:08:48的历史汇总数据(不包括此帖):
    发帖的总数量:16                       发帖的总分数:730                      每贴平均分数:45                       
    回帖的总数量:17                       得分贴总数量:1                        回帖的得分率:5%                       
    结贴的总数量:9                        结贴的总分数:310                      
    无满意结贴数:2                        无满意结贴分:40                       
    未结的帖子数:7                        未结的总分数:420                      
    结贴的百分比:56.25 %               结分的百分比:42.47 %                  
    无满意结贴率:22.22 %               无满意结分率:12.90 %                  
    楼主加油
      

  2.   

    如何能做到,当服务端断掉socket连接后,客户端能检测得到?
      

  3.   

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

  4.   

    kokobox ,又见到你了,哈哈!那怎样才能达到真正意义上的关闭呢?我是做了测试,在服务器端Socket.close()后好久,服务器端没有再发送数据给客户端,客户端也没有再发送数据给服务器端,但就是客户端调用socket.isClosed()还一直是false
      

  5.   

    先调用socket.getInputStream().close()socket.close()然后socket的isClosed()先关闭流然后再关闭socket
      

  6.   

    有默认等待的时间,close方法不能立即关闭
      

  7.   

    参考这个文章:
    http://www.w3china.org/blog/more.asp?name=hongrui&id=24039
      

  8.   

    通过这个操作,服务端的socket的isClosed()的确为false,但是,调用客户端的 socket的isClosed()也是false吗?
    如六楼所说的有默认等待时间,在linux下真是这样,但是在windows下,socket不是马上关闭的,那等待时间是多少呢?
      

  9.   

    isClosed()方法是判断客户端是否已经调用过close()方法了。这个方法并不是判断服务端是否已经断开连接了
    怎样判断服务端已经断开了连接的方法,我这里还没有。但是,在服务器端已经断开连接的情况下,IO操作会抛出异常的。当然,如果要非阻塞的判断服务器端是否断开连接,楼主试试InputStream.available()这个方法吧。具体我也没试过,看看返回值,有没有-1的情况
      

  10.   

    非阻塞的可能可以,但在阻塞方式下,无论服务器端是否socket is closed,InputStream.available() 的值一直为0,我觉得应该这样实现,在服务器端要关闭socket连接前,先发个密文给客户端,然后close这个sockey,客户端收到关闭socket的密文,则也close,也就是说,两边通过密文来同步。不知合理否?
      

  11.   

    当然合理,就应该这样做才对。当然,通信双方无论哪一方要关闭连接,都要要发送CloseSocket报文给对方,然后在关闭连接。
      

  12.   

    UDP通信要连接啊,不用这么操心吧?