你应该是用InputStream来接收socket数据;
调用read方法的时候,需要捕获异常,同时还需要保存返回值。有两种情况:
1.如果捕获到异常,说明接收超时了;
2.如果read()方法的返回值为-1,说明连接已经断开;   int bytesRead = 0;
   byte receiveBuffer[] = new byte[1024];
   try {
       bytesRead = inputStream.read(receiveBuffer, 0, 1024);
   } catch (InterruptedIOException e) {
       // 接收超时了
       // do something     
   }   if (bytesRead < 0)
   {
      // socket连接已经断开
      // do something
   }

解决方案 »

  1.   

    不是,关键他不是用inputStream来读入数据的,是用他自己的函数来读的
      public int readPa(conn_desc con) {
        String number = null; //手机号;
        String smtxt = null; //短信内容;    cmppe_result cr = null;    int result = 0;    try {
          cr = cmpp.readResPack(con);
          result = cr.stat;      switch (cr.pack_id) {
            case CMPP.CMPPE_NACK_RESP:
              logger.debug("get nack pack");
              break;        case CMPP.CMPPE_LOGIN_RESP:
              cmppe_login_result cl;
              cl = (cmppe_login_result) cr;
              logger.debug("ogin resp: STAT = " + cl.stat);
              break;        case CMPP.CMPPE_LOGOUT_RESP:
              logger.debug("logout resp: STAT = " + cr.stat);
              break;        case CMPP.CMPPE_DELIVER:
              cmppe_deliver_result cd = (cmppe_deliver_result) cr;
              number = new String(cd.src_addr, 0, 11); //源手机号码;          //将短信内容解码出来。
              int sm_len = cd.sm_len;          if (sm_len < 0)
                sm_len = 256 + sm_len;          switch (cd.data_coding) {
                case 0x08:
                  smtxt = new String(cd.short_msg, 0, sm_len, "UnicodeBig");
                  break;
                case 0x15:
                  smtxt = new String(cd.short_msg, 0, sm_len, "GB2312");
                  break;
                case 0x00:
                  smtxt = new String(cd.short_msg, 0, sm_len, "8859_1");
                  break;
                default:
                  smtxt = new String(cd.short_msg, 0, sm_len, "UnicodeBig");
                  break;
              }
              cmpp.cmpp_send_deliver_resp(con, cd.seq, cd.stat);
              insertTable(number, smtxt, mediaInfo.getMediaId());
              logger.debug("deliver: STAT = " + cd.stat);
              break;        case CMPP.CMPPE_CANCEL_RESP:
              logger.debug("cancel: STAT = " + cr.stat);
              break;        case CMPP.CMPPE_ACTIVE_RESP:
              logger.debug("active resp: STAT " + cr.stat);
              break;        default:
              break;      }
        }
        catch (UnknownPackException e) {
          result = -11111;
        }
        catch (DeliverFailException ee) {
          result = -22222;
        }
        catch (EOFException eee) {
          result = -33333;
        }
        catch (Exception e4) {
          result = -44444;
        }
        return result;
      }但是他的api上又没有超时的设置的, 很奇怪的?
      

  2.   

    你可以在READ的时候先判断能不能连接上对方,
    如果连接不上,就先退出了。
    判断是否处于连接状态的方法JAVA里提供了,你可查一下帮助。
      

  3.   

    我想这样的话,你好像只能如果超时kill这个读thread来完成这个工作了,我想是否有一个无阻塞的读写方法啊?