0

ファイルがブロック単位で送信するよりも12MB大きい場合は、クライアントサーバー間でファイルを転送しようとしています。それ以外の場合は、通常どおりに送信します。私の主な問題は、何かを転送するたびに元のバイトよりも多くのバイトが取得されることです。これを完了した後、ダイジェストメッセージを使用する必要があるため、そのままでは機能しません。もう1つは、ファイルを送信しようとするときです。ネットワークによって、クライアントはファイルを読み取ってサーバーが書き込むよりも速く送信するため、クライアントはプログラムを閉じて接続を閉じ、ファイルを破損します。私の転送コードは以下のとおりです。

これはクライアント転送コードです:

   if(fSize>maxfileSize){
        totbLidos = 0;
        byte[] fBytes = new byte[fBsize];
        while(totbLidos < fSize){
            int bRemain = (int) f.length() - totbLidos;
            if(bRemain < fBsize){
                fBsize = bRemain;
            }
            int bRead = tFile.read(fBytes, 0, fBsize);
            tServidor.write(fBytes, 0, fBsize);
            tServidor.flush();
            if(bRead>0){
                totbLidos+=bRead;
            }

            System.out.println("Total Bytes Lidos: " + totbLidos);

        }

        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
    else{
        totbLidos = 0;
        byte[] fBytes = new byte[fSize];
        while(totbLidos < fSize){
            int bRead = tFile.read(fBytes,0,fSize);
            if(bRead>0){
                totbLidos+=bRead;
            }
            tServidor.write(fBytes, 0, fSize);
            System.out.println("Total Bytes Lidos: " + totbLidos);
            tServidor.flush();
        }
        tFile.close();
        System.out.println("Ficheiro enviado");
        cliente.close();
    }
 }

サーバー転送コード:

if(fSize > maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fBsize];
            while(totbLidos < fSize){
                int bRemain = size - totbLidos;
                if(bRemain < fBsize){
                    fBsize = bRemain;
                }
                int bRead = tFile.read(fBytes, 0, fBsize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Bytes lidos: " + bRead);
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");

            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
        else if(fSize < maxfileSize){
            totbLidos = 0;
            DataInputStream tFile = new DataInputStream(cliente.getInputStream());
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName));
            byte[] fBytes = new byte[fSize];
            while(totbLidos < fSize){
                int bRead = tFile.read(fBytes,0,fSize);
                fos.write(fBytes);
                fos.flush();
                if(bRead>0){
                    totbLidos+=bRead;
                }
                System.out.println("Total Bytes Escritos: " + totbLidos);
            }
            System.out.println("Ficheiro recebido");
            fos.close();
            tFile.close();
            cliente.close();
            servidor.close();
        }
}
4

2 に答える 2

2

ここで読んだのと同じ数のバイトを書いているわけではありません。

fos.write(fBytes);

使ってみて

fos.write(fBytes, 0, bRead);
于 2012-12-13T21:08:41.350 に答える
0

@Peter Lawrey の回答に加えて、今後この種のバグを回避するために、Apache Commons IO API を再利用することをお勧めします。

IOUtils.copyLarge(InputStream input, OutputStream output, long inputOffset, long length)
于 2012-12-13T21:23:33.560 に答える