最近在做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);

解决方案 »

  1.   

    好象以前也遇到过在UNIX操作系统中的这个问题... 就是经常出现读不完. 
    原因是数据是分多个包过来的, 只用一个read()只能读一个包, 下一个包可能隔个0.1秒才过来. 
    记得当时的解决方法是, 需要循环的读取, 每次读完之后等待0.1秒, 再看Stream中是否有数据, 如果连续等待了50次(也就是5秒都没有任何数据过来), 就认为是读完了.
      

  2.   


    怎么能这么做啊...
    那你不是把后继数据包的内容都提前读掉了...设计好数据结构,给你个简单的例子
    数据包 结构为 包头+包体
    包头结构为 固定长度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,循环读取剩下的数据内容,直到长度符合总长循环读取下一个数据包....
      

  3.   

    根据 beiouwolf 大哥给的提示,测试了下,基本可以实现了,还有点问题,我这边再看看。非常感谢,我处理完了就结贴:)
      

  4.   

    设计一个socket熟悉。在c上省linger,java里也有相应的设置,一时忘了叫什么,查查jdk就行了