日期:2014-05-20  浏览次数:20922 次

java socket 分包收发问题
Socket分包收发报文,报文格式如下:|数据长度(4)|FLDT(4)|起始位置(4)|数据总长度(4)|数据(n)|
规定n<=2000,也就是数据分包以2000为长度
其中数据长度=n+12,起始位置标示该包中数据位于总数据长度中的位置,数据总长度为传输数据总长度
byte[] fileDown = new byte[socket.getReceiveBufferSize()];
OutputStream fileOS = null;
InputStream fielIS = null;
BufferedInputStream fileBIS = null;
ByteArrayOutputStream fileBAOS = null;
//socket读取
fielIS = socket.getInputStream();
fileBIS = new BufferedInputStream(fielIS);
int j = fileBIS.read(fileDown);
//写到byte[]
fileBAOS = new ByteArrayOutputStream();
fileBAOS.write(fileDown, 0, j);
//获取报文中数据总长度
byte[] blen = new byte[4];
System.arraycopy(fileDown, 12, blen, 0, 4);
int len = new BigInteger(blen).intValue();
System.out.println("len---->"+len);

这段代码打印 len--->4689

说明总长度是4689
但是由于这个Socket只读取了一次,我获得到的数据只有第一个包,也就是2000个长度内容

请问,如何编写方法,可以读取全部内容,去除报文头后,获取到完成的服务端发送的数据内容(byte[])

这段

------解决方案--------------------
先读取16个字节,然后将前4个字节转化为int,然后知道数据包的长度后,一个字节一个字节读取,一直读取到这个长度的数据。