请教高手:Socket.getInputStream().read(...) 返回-1是什么原因阿?

时间:2022-12-27 19:45:53
用的是非阻塞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错我, 请高手指点!
谢谢

12 个解决方案

#1


好象是文章结束

#2


读取流的结尾了,或没有流

#3


楼上2位说的我明白。 可是为什么会读到流的结尾呢?
至于说没有流,估计不太可能, 否则会空指针异常的!

请大家帮忙阿! 最近几天为这事郁闷死了!

#4


没有人肯帮忙啊?

#5


表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情

这个与C中的流含义是一样的,

#6


楼上的没错。

#7


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几次这个流。



#8


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

#9


来了好多高人哦,多谢各位!

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. 既然是阻塞读数据的,那么怎么读完数据流呢?

感谢!

#10


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

#11


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

#12


up!

#1


好象是文章结束

#2


读取流的结尾了,或没有流

#3


楼上2位说的我明白。 可是为什么会读到流的结尾呢?
至于说没有流,估计不太可能, 否则会空指针异常的!

请大家帮忙阿! 最近几天为这事郁闷死了!

#4


没有人肯帮忙啊?

#5


表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情

这个与C中的流含义是一样的,

#6


楼上的没错。

#7


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几次这个流。



#8


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

#9


来了好多高人哦,多谢各位!

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. 既然是阻塞读数据的,那么怎么读完数据流呢?

感谢!

#10


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

#11


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

#12


up!