最近在做MML接口,通过SOCKET连接,向目标主机发送命令,在SOLARIS下返回结果时,发现读取的字节被截取,只能读取前面一部分,但相同代码在WINDOWS主机下,向同一主机发送命令,返回字节正常!
读取字节代码如下:
byte[] buffer = new byte[71680];//现有长度未超过71680
int read = is.read(buffer);
String returnInfo = new String(buffer, 0, read,"GBK");
System.out.println("从服务器获得返回结果:" + returnInfo);
读取字节代码如下:
byte[] buffer = new byte[71680];//现有长度未超过71680
int read = is.read(buffer);
String returnInfo = new String(buffer, 0, read,"GBK");
System.out.println("从服务器获得返回结果:" + returnInfo);
原因是数据是分多个包过来的, 只用一个read()只能读一个包, 下一个包可能隔个0.1秒才过来.
记得当时的解决方法是, 需要循环的读取, 每次读完之后等待0.1秒, 再看Stream中是否有数据, 如果连续等待了50次(也就是5秒都没有任何数据过来), 就认为是读完了.
怎么能这么做啊...
那你不是把后继数据包的内容都提前读掉了...设计好数据结构,给你个简单的例子
数据包 结构为 包头+包体
包头结构为 固定长度12位
4位 无符号int 表示这个数据包长度,包头+包体
4位 无符号int 命令号
4位 无符号int 序列号
包体结构根据自己的协议定制假设现在你的这个数据包需要传送一个10位长的字符串
那整个数据包应该是这样
字节位置 内容
byte[0 - 3] 22 // 包头12+包体10
byte[4 - 7] 1 // 假设命令号为1
byte[8 - 11] 1 // 序列号1
byte[12 - 21] 10 // 包体字符串读取时,先读12位包头,读完后解析0-4数据
根据这个长度-12,循环读取剩下的数据内容,直到长度符合总长循环读取下一个数据包....