当我们通过socket进行通讯的时候,接收数据,大家一贯的写法可能是下面这样的
//接收数据
byte[] b = new byte[len];
is = socket.getInputStream();
input = new DataInputStream(is);
input.read(b);
当时当我用这样的方法接收数据的时候发现接收的数据不全,于是我在read里加了个while循环,当read(b)返回-1的时候说明数据已经接收完了,没有可接收的数据,数据地区接收完了,但又有一个新的问题,每次都会抛出一个EOFException异常,导致socket通讯终端。百度了一下,发现这个是一个正常的读金数据结束的异常。
那怎么?于是看了一下DataInputStream的API,发现里面有一个readFully(b)的方法,修改之后果然问题解决了。
然后百度了一下这两个方法的却别:
readFully(byte[] b) 要求读出的字节长度与byte[]的长度相同;
read(byte[] b)可能不会读满就会返回;
如果在通讯协议中,明确知道需要读取多少字节,可以采用readFully方法
问题解决,虽然问题很简单,但的确很容易碰到,在此记录引以为戒,哈哈