java套接字输入流用零随机填充字节数组

juud5qan  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(241)

我正在创建基本的客户机-服务器应用程序,用于通过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
}

代码中有什么问题吗,或者我遗漏了什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题