0

JAVA でファイルを送信しようとしています。私の問題は、クライアントがファイルの最後に到達したかどうかわからないことです。したがって、Client の while ループは決して終了しません。私を助けてください。

サーバー (データをクライアントに送信)

File myFile = new File("C://LEGORacers.exe");

      byte[] mybytearray = new byte[(int) myFile.length()];
      BufferedInputStream bis = null;
      OutputStream os = null;

        bis = new BufferedInputStream(new FileInputStream(myFile));
        bis.read(mybytearray, 0, mybytearray.length);

        os = socket.getOutputStream();      
        os.write(mybytearray, 0, mybytearray.length);       
        os.flush();

        bis.close();

クライアント (サーバーからデータを取得)

byte[] buf = new byte[1024];
    InputStream is = null;
    int bytesRead = 0;

    is = client.getInputStream();
    FileOutputStream fos = null;
    fos = new FileOutputStream("C://copy.exe");


    BufferedOutputStream bos = new BufferedOutputStream(fos);

     try {
            while (-1 != (bytesRead = is.read(buf, 0, buf.length))) {
            // This while loop never ends because is.read never returns -1 and I don't know why...

                bos.write(buf, 0, bytesRead);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
               is.close();
               bos.flush();
               bos.close();
               fos.close();

        }
4

2 に答える 2

1

サーバーを閉じましたOutputStreamか? そうでない場合は、ループが永続的bytesReadに 0 に設定されている可能性があるため、そのストリームを閉じる必要がある場合があります。

OutputStreamデータを送信した後もサーバーを開いたままにしておく必要がある場合は、ストリームの先頭でデータのサイズをバイト単位で送信し、サーバーが送信することを示すすべてのバイトが揃うまでループすることもできます。

于 2013-10-28T20:54:53.783 に答える
1

サーバー上のソケット出力ストリームを閉じます。フラッシュはストリームを終了しません。これは、サーバーが書き込みを完了したというシグナルを送信するために必要なことです。あなたが投稿したものから、サーバー側で出力ストリームを閉じる場所がわかりません。

于 2013-10-28T20:27:44.750 に答える