请大家帮忙分析一下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 就不能接收。
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 就不能接收。
你的代码逻辑是不是这样的(猜测的,因为你的这部分代码贴得少):
如果bodylength > socketBufferSize 则分多次读取(即:多次调用
DataInputStream. read(buf[], socketBufferSize*iLoop, readSize)来读取数据)。
若是这样,肯定是不正确的.
你能多贴些网络读取的代码,这样才好讨论问题.否则我只是个猜测的,因为你的这部分代码贴得少.
你如果多次DataInputStream.read,它不可能先读32K就返回一个对象。要么直接InputStream读完了重新构造对象。
------------ 接收端代码 ----------------------
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();