我正在创建基本的客户机-服务器应用程序,用于通过java套接字发送文件。考虑到文件(或者在某些情况下序列化的对象)可能非常大,我首先发送文件大小,然后写入512字节的块,直到发送完所有文件。对于小文件(小于200kb),一切正常,但当服务器尝试发送较大的文件时,客户端读取所有内容( read()
方法不会被阻塞),当我在客户机中打印接收到的字节数组时,在其中的随机位置上有这样的零(可以是一行400多个零) [25,-46,-54,12,74,.....,0,0,0,0,0,0,0,0,0,0,0,0,.....,54,98,-87,84....]
,看起来500+字节是正常的,然后是400+零,然后又是正常字节,然后是零。。。。。等等。我在服务器端打印了相同的数组(另一台发送文件的pc),而数组中并没有这些零。请注意,在同一台pc上运行服务器和客户端时,不会发生这种情况
服务器端(这只是发送1mb数组的测试,我得到512b块并发送它们):
objBytes = bytes to be sent...
synchronized (client.getSocket().getOutputStream()) {
int sendObjectSize = 0; //how much bytes are sent
while (objBytes.length - sendObjectSize > 0) {
byte[] tmpArray = Arrays.copyOfRange(objBytes, sendObjectSize, sendObjectSize + Math.min(objBytes.length - sendObjectSize, 512));
client.getOutStream().write(tmpArray, 0, tmpArray.length);
sendObjectSize += 512;
client.getOutStream().flush();
}
}
客户端:
objInputArray = array to be received...
int size = objInputArray.length;
int readBytes=0;
while(size-readBytes>0) {
byte[] tmpArray=new byte[Math.min(size - readBytes, 512)];
inStream.read(tmpArray, 0, Math.min(size - readBytes, 512));
System.arraycopy(tmpArray,0,objInputArray,readBytes,tmpArray.length);
readBytes+=512; //updating read bytes
}
代码中有什么问题吗,或者我遗漏了什么?
暂无答案!
目前还没有任何答案,快来回答吧!