用的是非阻塞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错我, 请高手指点!
谢谢
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错我, 请高手指点!
谢谢
System.out.println("EOF Error!");
offset = 0;楼主别被System.out.println("EOF Error!");这句迷或了。。他不是真的出错。而是表示数据流已读完。而读完一串流的标志就是返回一个 -1 所以,应该把这句改成
System.out.println("Data stream read end!");
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。
表示流结束,流中所有字节已经读完了,没有再可以读的字节了,这个与没有流是两回事情这个与C中的流含义是一样的,zhuangnet():
如果你的程序运行时会打印10几次这个消息。就说明你的程序读了10几次这个流。两位说的都很正确,我也明白,我的问题是为什么会出现这种情况呢?也就是说造成读到流末尾的真正原因是什么呢?由于我的通信程序要求连续运行的,不能草率处理这种情况,否则会造成数据丢失,给下层的应用造成负面影响!因此我希望找到根本原因,请大侠们多多指点! 由于数据发送端不是我写的,所以这几天我在想,是否发送端出错会造成这种错误呢? 还是说网络传输的确有可能会出现这种不正常的情况,如果不是发送端程序的问题的话,作为接收端的我应该作什么处理呢?正常情况下:InputStream的read方法是阻塞的,也就是说流中有数据才返回。当然我说的是正常情况下。This method blocks until input data is available, end of file is detected, or an exception is thrown. 既然是阻塞读数据的,那么怎么读完数据流呢?感谢!
...
byte[] buff=new byte[1024];
int len;
while ((len=in.read(buff))>-1){
if (len>0){
//已经读到数据,处理这些数据
//注意,读的数据不一定把buff读满,因为这个与流的传输速度,块大小等有关。
}
}
System.out.println("流读完");
in.close()