这两天把用socket发送定长报文通讯改成分页请求后,就去调试了,由于数据量大,部署上去我接收到的数据最会打印长度都是8912,然后就用我自带的笔记本通过socket发同样一模一样的数据后发现没问题,然后我们调试双方就各种考虑问题,他们怀疑我的代码最大只能接收8912的byte限制,我就说哪不对啊,我自己测多大都能收过来,就部署到你这里,你们给我发多少数据就接收都少数据,他们又说我这边可能由于网络,因为毕竟是跨网段的,可能会有延迟,而我没有加延迟导致数据接收的少,说着他就开始这样演示说他那边加了延迟就不会这样了,我发现是这样啊,然后就回公司研究去了。
回到公司加了延迟发现还是不行,后来定位到原来是in.available()问题,可能是环境,也可能是网络,他那边就是全部发过来,我最大就是8912的长度,8912的长度开辟空间,接收也就只能是8912了,所以数据解析失败,然后解决的办法是,用in.read()读取头部5位,这个头部5位是我们自己定义的报文长度,然后获取长度是23900,我就用这个个得到的真实的又不数据,然后根据这个长度开辟空间,这样所有的数据就都能接收到了。
改之前
改之后
就可以了
int lengthHeader = 5;
byte[] lengthByte = new byte[lengthHeader];
in.read(lengthByte);
String lengthStr = new String(lengthByte);
int lengthI = Integer.parseInt(lengthStr);
// 根据长度开辟空间
System.out.println("byte[]接收开辟的空间:" + lengthI);
byte[] receiveFirst = new byte[lengthI];
int readCountFirst = 0; // 已经成功读取的字节的个数
while (readCountFirst < lengthI) {
readCountFirst += in.read(receiveFirst, readCountFirst, lengthI - readCountFirst);
}
if (receiveFirst.length == 0) {
System.out.println("没有接收到数据!");
return null;
}
String strData = new String(receiveFirst);
String pjStr = lengthStr + strData;
//System.out.println("接收的数据:" + strData);
return pjStr;