isconnected表示连接是否成功,不能用来判断是否断开
java的socket都是阻塞的,只有一个办法用来判断是否断开:
用socket取得对应的InputStream,然后调用read
如果连接存在,而且有数据可读,那么read返回读出的数据
如果连接存在,但是没有数据可读,那么read将阻塞
如果连接被雅致断开,那么read返回-1
如果连接被强行断开,那么read抛出IO异常

解决方案 »

  1.   

    谢谢楼上的解答"如果连接被雅致断开,那么read返回-1"
    这个何解?
      

  2.   

    正常情况下tcp连接被断开要经过3次握手,然后释放所有资源。这叫做雅致断开,这种情况下双方都知道连接已断开,所以read能够正常返回-1
    但是由于网络程序的特殊性,有可能因为网络故障等原因造成不经过3次握手而强行断开,这种情况下双方可能不知道连接实际已经不存在了,所以read会抛出异常
    一般这样处理:检查read的返回值,如果是-1则做断开处理,如果read时抛出IOException也做断开处理,如果read正常返回则做接收到数据的操作
      

  3.   

    原来是这样,谢谢楼上各位给的清楚的说明!read抛出异常我知道是断开的,但本来我以为read返回-1并不是代表断开而只是没有收到包。这下解决了我一个大疑问了,谢谢!