1

クライアントからの接続を受け入れるサーバー ソケットを作成しました。接続が確立されると、バイトを書き込む OutputStream を使用してイメージが転送されます。私の質問は、すべての画像が正しく転送されない場合があるため、ソケット接続を閉じる前に、OutputStream がバイトの書き込みを終了したかどうかを確認するにはどうすればよいかということです。これは私が使用しているコードです:

File photoFile = new File(getHeader); //getHeader is the file that i have to transfer
int size2 = (int) photoFile.length();
byte[] bytes2 = new byte[size2];
try {
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(photoFile)); 
    buf.read(bytes2, 0, bytes2.length);
    buf.close();
    } catch (FileNotFoundException e) {
         e.printStackTrace();
    } catch (IOException e) {
         e.printStackTrace();
    }
    client.getOutputStream().write(bytes2, 0, size2); //client is the server socket

ありがとう

4

2 に答える 2

6

My question is how can i check if the OutputStream has finished to write the bytes before close the socket connection, because sometimes not all the image is correctly transferred

No, your problem is that you are assuming that read() fills the buffer. The OutputStream has finished writing when the write returns. Memorize this:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

This is the correct way to copy streams in Java. Yours isn't.

You are also assuming that the file size fits into an int, and that the entire file fits into memory, and you are wasting both time and space reading the entire file (maybe) into memory before writing anything. The code above works for any size buffer from 1 byte upwards. I usually use 8192 bytes.

于 2013-07-11T08:02:57.950 に答える
4

一般的な解決策は、送信されるデータの長さを表すバイト数 (たとえば 4) をデータの前に付けることです。

受信サーバーは最初の 4 バイトを読み取り、長さを計算して、ファイルの読み取りが終了したことを認識します。

于 2013-07-11T08:01:04.393 に答える