0

Javaでソケットを介してファイルを転送しようとしています。実際に転送できましたが、1つの問題が発生しました。問題は、送信されるファイルのサイズが縮小することです。たとえば、クライアントである300MBのファイルを転送します。 299mbしか受信しません....私は何が問題なのか疑問に思っていました。

サーバ側

File myFile = new File (basePath+"\\"+input.readUTF());
byte [] mybytearray  = new byte [1024];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
txtArea.append("Sending... \n");
while (true)
{
    int i = bis.read(mybytearray, 0, mybytearray.length);
            if (i == -1) {
        break;
    }
    output.write(mybytearray, 0, i);
    txtArea.append("Sending chunk " + i + "\n");

}
output.flush();

クライアント側

output.writeUTF("get");
txtArea.append("Starting to recive file... \n");
                long start = System.currentTimeMillis();
                byte [] mybytearray  = new byte [1024];
                txtArea.append("Connecting... \n");
                output.writeUTF(remoteSelection);
                FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = input.read(mybytearray, 0, mybytearray.length);
                while(bytesRead != -1) 
                {
                    bos.write(mybytearray, 0, bytesRead);
                    txtArea.append("got chunk" + bytesRead +"\n");
                    bytesRead = input.read(mybytearray, 0, mybytearray.length);
                }
bos.flush();
4

1 に答える 1

3

Java でストリームをコピーする正規の方法は次のとおりです。

int count;
byte[] buffer = new byte[8192]; // or whatever you like really, not too small
while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
}

任意の長さの入力で機能します。入力全体をメモリにロードしません。そうすることによって遅延が追加されることはありません。

複数のファイルを送信する場合は、最初に長さを DataOutputStream.writeLong(); 経由で送信する必要があります。逆関数を介して反対側でそれを読み取ります。読み取り終了時のループ条件を調整して、正確にそのバイト数を読み取った後に終了します。見た目ほど単純ではありません。読者の演習として残しておきます。

于 2012-05-13T02:18:01.573 に答える