Posts Tagged ‘1448’

Socket读取数据包时的1448字节问题

星期六, 7月 5th, 2008

昨天和同事调试接口的时候,发现接收到的数据包的字节内容后面部分全部是0.
而经过日志确认同事接口写回的数据包是正常的,
今天特意调试了一下,才发现是Socket读取数据时的1448字节问题。

通过google搜索,可以发现,javaSocket的getInputStream进行read到数组的时候,
每次的一次性读取时最多只能获得1448字节的数据。

下面是存在问题的写法:
[code]
//数据包前四个字节是数据包的长度说明
private byte[] readResponse(Socket sc) {
InputStream is;
try {
is = new BufferedInputStream(sc.getInputStream());
byte[] lenb = new byte[4];
is.read(lenb);
byte[] pakb = new byte[HessionIO.bytesToInt(lenb, 0, 4) + 4];
pakb[0] = lenb[0];
pakb[1] = lenb[1];
pakb[2] = lenb[2];
pakb[3] = lenb[3];
is.read(pakb, 4, pakb.length - 4);
return pakb;
} catch (IOException e) {
e.printStackTrace();
return new byte[0];
}

}

[/code]

修改bug之后的读取方法

[code]
/**
* 从Socket读取应答数据包
* 数据包前四个字节是数据包的长度说明
* @param sc
* @return
*/
private byte[] readResponse(Socket sc) {
InputStream is;
try {
is = sc.getInputStream();
byte[] lenb = new byte[4];
is.read(lenb);
byte[] pakb = new byte[HessionIO.bytesToInt(lenb, 0, 4) + 4];
pakb[0] = lenb[0];
pakb[1] = lenb[1];
pakb[2] = lenb[2];
pakb[3] = lenb[3];
//数据包太大的时候,无法一次性读取完毕,要考虑大于1448字节的问题,需要多次读取接收数据,
//每一次的read最多接收1448字节的数据:
int needDataLen=pakb.length - 4;
while (needDataLen>0) {
int readedlen=is.read(pakb, pakb.length-needDataLen, needDataLen);
log.info(”needDataLen==”+needDataLen +”,readedlen== “+readedlen);
needDataLen=needDataLen-readedlen;
}

return pakb;
} catch (IOException e) {
logger.error(”Hession readResponse error: “,e);
return new byte[0];
}

}

[/code]

下面是读取数据包时得到的日志:
2008-07-05 17:55:31.505 INFO needDataLen==49024,readedlen== 1444
2008-07-05 17:55:31.506 INFO needDataLen==47580,readedlen== 1448
2008-07-05 17:55:31.508 INFO needDataLen==46132,readedlen== 1448
2008-07-05 17:55:31.551 INFO needDataLen==44684,readedlen== 1448
2008-07-05 17:55:31.552 INFO needDataLen==43236,readedlen== 1448
2008-07-05 17:55:31.553 INFO needDataLen==41788,readedlen== 1448
2008-07-05 17:55:31.593 INFO needDataLen==40340,readedlen== 1448
2008-07-05 17:55:31.594 INFO needDataLen==38892,readedlen== 1448
2008-07-05 17:55:31.595 INFO needDataLen==37444,readedlen== 1448
2008-07-05 17:55:31.597 INFO needDataLen==35996,readedlen== 1448
2008-07-05 17:55:31.598 INFO needDataLen==34548,readedlen== 1448
2008-07-05 17:55:31.599 INFO needDataLen==33100,readedlen== 1448
2008-07-05 17:55:31.600 INFO needDataLen==31652,readedlen== 1448
2008-07-05 17:55:31.601 INFO needDataLen==30204,readedlen== 1448
2008-07-05 17:55:31.638 INFO needDataLen==28756,readedlen== 1448
2008-07-05 17:55:31.639 INFO needDataLen==27308,readedlen== 1448
2008-07-05 17:55:31.640 INFO needDataLen==25860,readedlen== 1448
2008-07-05 17:55:31.641 INFO needDataLen==24412,readedlen== 1448
2008-07-05 17:55:31.643 INFO needDataLen==22964,readedlen== 1448
2008-07-05 17:55:31.644 INFO needDataLen==21516,readedlen== 1448
2008-07-05 17:55:31.645 INFO needDataLen==20068,readedlen== 1448
2008-07-05 17:55:31.646 INFO needDataLen==18620,readedlen== 1448
2008-07-05 17:55:31.647 INFO needDataLen==17172,readedlen== 1448
2008-07-05 17:55:31.648 INFO needDataLen==15724,readedlen== 1448
2008-07-05 17:55:31.650 INFO needDataLen==14276,readedlen== 1448
2008-07-05 17:55:31.651 INFO needDataLen==12828,readedlen== 1448
2008-07-05 17:55:31.652 INFO needDataLen==11380,readedlen== 1448
2008-07-05 17:55:31.653 INFO needDataLen==9932,readedlen== 1448
2008-07-05 17:55:31.654 INFO needDataLen==8484,readedlen== 1448
2008-07-05 17:55:31.655 INFO needDataLen==7036,readedlen== 1448
2008-07-05 17:55:31.683 INFO needDataLen==5588,readedlen== 1448
2008-07-05 17:55:31.684 INFO needDataLen==4140,readedlen== 1448
2008-07-05 17:55:31.685 INFO needDataLen==2692,readedlen== 1448
2008-07-05 17:55:31.686 INFO needDataLen==1244,readedlen== 1244

具体的可以通过google搜索获得更多资料:

http://www.google.cn/search?q=--escaped_anchor:e392b3041728c87dd7d072bc842f146a--+1448+%CE%CA%CC%E2

Tags: 1448, Java, socket

Related posts