2016-04-24 9 views
0

私のアプリでは、ソケットを使用してクライアントからファイルを送信しています。もう一方の側では、別のクライアントがInputStreamを使用してファイルを受信し、次にbufferedOutputStreamがファイルをシステムに保存します。ファイルの読み込み時にInputStream.read()がハングアップする

なぜ、ファイルが完全に転送されていないのかわかりません。私はこれがネットワークの過負荷のためだと思う、とにかく、私はそれを解決する方法を知らない。

送信機は、次のとおりです。

Log.d(TAG,"Reading..."); 
       bufferedInputStream.read(byteArrayFile, 0, byteArrayFile.length); 
       Log.d(TAG, "Sending..."); 
       bufferedOutputStream.write(byteArrayFile,0,byteArrayFile.length); 

bufferedOutputStream.flush(); 

レシーバーは次のとおりです。

bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file)); 
          byteArray=new byte[fileSize]; 

          int currentOffset = 0; 

          bytesReaded = bufferedInputStream.read(byteArray,0,byteArray.length); 
          currentOffset=bytesReaded; 

          do { 
           bytesReaded = bufferedInputStream.read(byteArray, currentOffset, (byteArray.length-currentOffset)); 
           if(bytesReaded >= 0){ currentOffset += bytesLeidos; 
           } 
          } while(bytesReaded > -1 && currentOffset!=fileSize); 


          bufferedOutputStream.write(byteArray,0,currentOffset); 
+0

bytesReadedの値をログに記録し、どのように進んでいるかを確認してください。 – AdamSkywalker

+0

通常、デバッガをステップ実行し、変数値を調べることをお勧めします。 –

+0

私はこれまでにやったことがあります。たとえば、ファイルに10000バイトがある場合、9000バイトを受信したときにスタックされます。 –

答えて

3

filesizeがどこから来たあなたは状態はありませんが、このコードの多くの問題があります。言及すべきことが多すぎます。すべてを投げ捨て、DataInputStream.readFully()を使用してください。またはファイルのサイズ、スケールしないテクニックをバッファリングを必要としない、次のコピーループを使用し、ファイルサイズがintに収まる、とレイテンシを追加することを前提としています

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

は、これを使用両端で。同じ接続を介して複数のファイルを送信している場合、それはより複雑になりますが、あなたはそれを述べていません。

+0

あなたのループでは、 "in"変数は "InputStream"でしょうか? –

+0

@MMManuelもちろん、 'out'は' OutputStream'です。私はこれが必要だとは思わなかった。 – EJP

+0

書き込みイベントごとに "count"でオフセットを増やすべきではありませんか? –

関連する問題