你可以看看http://www.csdn.net/expert/Topic/197/197530.shtm的贴子原理是这样的:读到长度0不能断定是已经断开.读到-1,才代表输入流已经被关闭,说明socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知道能不能一次将发过来的包读完,也无法知道一次是不是读完整了包,所以线称一直循环在读并且一直在解包.这样即能知道什么时候server断,也完成了消息的解读,我的方案是这样的,在大数据量高速率网络上运行没有发生过丢包. 下面给出客户端的一段主要代码/
 
  //线程运行主程序段
  public void run(){
    while (Action !=0){
    try{
      is = socket.getInputStream();
      ir = new InputStreamReader(is);
      AppServer.sysinfo.HNMState = "正常!!";
      char str[] = new char[1024];
      ir.read(str);    //平时在这里等待,但是SERVER一断就立即会向下运行。
      String Packet = new String(str);
      if ( Packet.trim().length()>0) {
//        AppServer.log.showmessage(Packet,0);
        UnPack(Packet);
      }
      else{
        Integer ee = new Integer(Packet.trim().length());
        AppServer.sysinfo.HNMState = "断开!!";
        break;
        }
      }catch (Exception err){
      AppServer.log.showmessage("解包错误",0);  //没有出现过EXCEPTION
      }
    }  }