用的是非阻塞socket, 所以在一个循环里面读流,如下
while (!isTerminated) {
   
   Socket socket = getSocket();
   int offset = 0;
   int maxLength = 256 * 1024;
   byte[] buffer = new byte[maxLength];   int readLength = socket.getInputStream().read(buffer, offset, maxLength);
   if (readLength == -1) {
     System.out.println("EOF Error!");
     offset = 0;
   } else {
     offset += readLength;
   }   if (offset >= maxLength) {
     offset = 0;
   }
}运行结果表明有时候会连续几十次报EOF错我, 请高手指点!
谢谢

解决方案 »

  1.   

    if (readLength == -1) {
         System.out.println("EOF Error!");
         offset = 0;楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
    System.out.println("Data stream read end!");
    如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
      

  2.   

    键盘输入结束是 ctrl+z,回车一般应用中表示输入的被确认,把输入缓冲区中的提交给应用
      

  3.   

    来了好多高人哦,多谢各位!tanghuan():
    表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情这个与C中的流含义是一样的,zhuangnet():
    如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?感谢!
      

  4.   

    利用循环读,一直读到流结尾,阻塞读是表示要一直等到有可以读的数据时候,read方法才会返回
      

  5.   

    InputStream in;
    ...
    byte[] buff=new byte[1024];
    int len;
    while ((len=in.read(buff))>-1){
      if (len>0){
        //已经读到数据,处理这些数据
        //注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
      }
    }
    System.out.println("流读完");
    in.close()