2011-07-14 12 views
0

ソケットを介してサーバからクライアントに画像ファイルを送信しようとしています。 ソケットは、サーバーからクライアントへの一部の文字列を送信するために以前使用されていました(バッファされた入出力ストリームを使用して)ソケット:JPEGファイルの早すぎる部分

"JPEGファイルの時期尚早終了"エラーが発生したため、画像ファイルを正しく受信できません。

サーバーは最初にクライアントにファイルサイズを送信し、クライアントはそのサイズのbyte []を作成し、ファイルの受信を開始します。ここで

は、コードは次のとおりです。

サーバー:

 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
     //Send file size 
     dos.writeInt((int) file.length()); 

     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 
     byte[] fileBytes = new byte[bis.available()]; 
     bis.read(fileBytes); 
     bis.close(); 

     BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 
     bos.write(fileBytes); 
     bos.flush(); 

はクライアント:さらに興味深いことに

 DataInputStream dis = new DataInputStream(socket.getInputStream()); 
     //Receive file size 
     int size = dis.readInt(); 

     BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); 
     byte[] fileBytes = new byte[size]; 

     bis.read(fileBytes, 0, fileBytes.length); 

私は、ファイルサイズを送信するとの間で約2秒間サーバ睡眠を聞かせている場合バイト[]を書き込むと、画像は正しく受信されます。サーバーとクライアントの間に何らかの競合状態が存在するのだろうか。

+1

読み取り/書き込みプログラムとストリームを使用することはできません。どちらか一方のタイプを使用するか、アプリケーションが混乱する可能性があります。 –

+0

サーバに 'BufferedReader'があるのはなぜですか?何か戻ってくるの? – powerMicha

答えて

1

エラーが最も可能性が高いここにある:

byte[] fileBytes = new byte[bis.available()]; 

ファイルのサイズを返しませんavailable方法。入力バッファのサイズだけが返される可能性があります。これはファイルのサイズよりも小さくなります。メソッドのAPIドキュメントはBufferedInputStreamを参照してください。

また、下の行のreadは、ファイル全体を一度に読み取ることが保証されていません。これは実際に読み込まれたバイト数を返します。要求されたバイト数より少なくなることがあります。クライアントコードでは、すべてのデータを読み取ったかどうかを実際に確認することなく、同じ方法でreadを使用しています。次のように

+0

Jesperはこれについて絶対に正しいです。クライアント側では、ループを使って、bis.read(buffer)== - 1をガードして受信することにしました。 – stackoverflower

+0

この遅れて受け入れて申し訳ありません – stackoverflower

0

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

int count; 
byte[] buffer = new byte[8192]; // more if you like, but over a network it won't make much difference 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

あなたのコードは、論理的に、これはいくつかの点で一致しません。

また、ファイルサイズまたは着信ネットワーク転送のサイズを判断する有効な方法はありません(Javadocを参照)。正しい使用法がある場合はほとんどありません。これらは2つではありません。

関連する問題