0

Javaでのファイル転送ソケットを使用しています。ここにクライアントコードがあります

for(int i = 0;i < fileList.size();i++) {
    String filename = (String)fileList.get(i);
    RequestFile(filename);

    try {
        BufferedOutputStream fileWriter = new BufferedOutputStream(
                                              new FileOutputStream(
                                                  new File(PROGRAM_PATH + "/" + 
                                                           filename)));         
        int packet;
        int count = 0;

        while((packet = fileReader.read()) != -1) {
            fileWriter.write(packet);
            count++;
        }

        System.out.println(filename + " receiver complete. (count : " + count + ")");
        fileWriter.flush();
        fileWriter.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

そして、ここにサーバーコードがあります

public void SendFile(String filename) {
    try {
        fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename));

        int packet;
        int count = 0;
        while((packet = fileReader.read()) != -1) {
            count++;
            fileWriter.write(packet);
        }
        fileWriter.write(-1);
        System.out.println(count);

        fileReader.close();
    }
    catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

サーバーのカウントを確認したところ、 でした635。これは、サーバーがデータ635時間を送信したことを意味します。ただし、クライアントの印刷枚数は のみ512です。read()(0 から 511 まで) で止まっていると思います。

System.out.println(filename + " receiver complete. (count : " + count + ")");

印刷されません。誰か理由と解決策を教えてくれませんか?

4

1 に答える 1

0

サーバー側では、値を含むバイトをクライアントに送信できません-1。この行:

fileWriter.write(-1);

それはあなたが望むことをしません。このwrite()メソッドは、パラメーターの下位 8 ビットを取得し、それを 1 バイト (この場合は0xff) として送信します。クライアント側では、これを(タイプ の) としてではなく(タイプ の)fileReader.read()として受け取ります。0xffint-1int

-1ストリームの終わりに達したことを示す特別な値です。書き込みまたは読み取りが有効なデータではありません。を送信する-1と、クライアントはそれを として読み取ります0xff=255。送受信できる値は0..255両方を含みます。繰り返し-1ますが、ストリームの終わりの特別な値です。

サーバー側では、出力ストリームをフラッシュしたり閉じたりしません。それが違いを説明している可能性があります (バッファ内のデータ保持がクライアントに到達しない可能性があります)。

于 2014-10-27T12:13:40.093 に答える