请大家帮忙分析一下Socket 传输 大数据包的 问题….Socket Client 发送方法DataOutputStream.write(String.getBytes())  //Buf 为 String.
Socket server 接收方法:DataInputStream. read(buf[], socketBufferSize*iLoop, readSize)
Socket 接收,先读取包头,包头里填有数据包长度,bodylength
如果bodylength > socketBufferSize 则分多次读取。
在Windows XP Professional, 平台上。Socket.sendBufferSize = 8K
3K, 7K 22K 发送接收都没有问题将Socket Server 程度发布到 Sun solaris 10 服务器上后。( Socket.ReceiveBufferSize > 32K )
测试数据包,3K, 7K,但数据超过8K 就不能接收。

解决方案 »

  1.   

    答:一看到你的描述,我就知道问题在哪儿.这个问题我太熟悉了.完全肯定:你接收方的接收数据的网络代码写得是不正确的.
    你的代码逻辑是不是这样的(猜测的,因为你的这部分代码贴得少):
    如果bodylength > socketBufferSize 则分多次读取(即:多次调用
    DataInputStream. read(buf[], socketBufferSize*iLoop, readSize)来读取数据)。
    若是这样,肯定是不正确的.
    你能多贴些网络读取的代码,这样才好讨论问题.否则我只是个猜测的,因为你的这部分代码贴得少.
      

  2.   

    DataInputStream一次读取一个对象,且不管是什么对象。如果客户端提交的对象是100K。
    你如果多次DataInputStream.read,它不可能先读32K就返回一个对象。要么直接InputStream读完了重新构造对象。
      

  3.   

    TO jiangnaisong ,我在Windows 平台上测试没有问题
        ------------  接收端代码 ----------------------
         byte[] buf  = new byte[bodylen];
        if(bodylen>socketSetting.bufferSize){
    int iTimes = 0 ;
    int readSize = socketSetting.bufferSize;
    int restSize = bodylen;
    while (in.read(buf, socketSetting.bufferSize*iTimes , readSize)== socketSetting.bufferSize){   
    iTimes ++;
    restSize = restSize - readSize;
    if(restSize < readSize)    {readSize = restSize;   }
    }
       }else{
              in.read(buf,0,bodylen);
       }
        RecvData = new String(buf,socketSetting.charSetComm);
      -------------------- 发送端 --------------------------------
            DataOutputStream.write(sendBuf.getBytes()); 
    DataOutputStream.flush();
      

  4.   

    在Unix上,接收的前8K数据也没有问题,真是奇怪了。.。
      

  5.   

    To jiangnaisong ,非常感谢你的解释,问题解决了,。