0
私はJavaを搭載したサーバーとAndroidを搭載したクライアントを使っています。すべて正常に動作しますが、Androidでファイルを受信しようとすると、IO入力がフリーズします。私はJavaのテストアプリでも同じことをしようとしていて、うまく動作します。Javaを搭載したAndroidとJavaのWiFifreezingでファイルを送信する
クライアント側での私のコード:
int bytesRead;
long current = 0;
byte [] mybytearray = new byte[InfoPrograma.BUFFER_LENGTH];
//Receive file
InputStream is = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file)
);
while (
(bytesRead = is.read(
mybytearray,
0,
mybytearray.length
)
) >= 0) {
current += bytesRead;
bos.write(mybytearray, 0 , bytesRead);
}
bos.flush();
bos.close();
サーバー側のコード:
File file = new File(fileStr);
byte[] buffer = new byte[InfoPrograma.BUFFER_LENGTH];
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file)
);
OutputStream os = socket.getOutputStream();
long tmp = 0;
while ((count = bis.read(buffer)) > 0) {
os.write(buffer, 0, count);
tmp += count;
System.out.println(tmp);
}
os.flush();
BUFFER_LENGHTは、あなたが何かを必要とする場合は、それをしてくださいお願いし2000です。
ありがとうございます。
ファイルの送信が完了したら、サーバー側でソケットが閉じられますか?接続が開いたままの場合は、クライアントの読み取りが期待どおりに動作していない可能性があります。 read()またはbytes()を0にして回転をブロックしているかどうかを知っていますか? – ribram
サーバー上のソケットが閉じません。私はタイムアウト設定を削除しました。私はdebuuggingでそれをもう一度見て、それは完全にファイルを受信するようだが、最後の読み取りを行うとき、受信するバイトがないとき、それはブロックする。どのようにしてそれを防ぐことができますか? – elxordi
出力ストリームを閉じるとそれを行うかどうかは分かりませんが、そうでない場合はソケットのclose()が明示的に行われています。サーバー側のソケットを閉じると、クライアントの読み込みが0になるはずです。読み込みが0より大きい場合にクライアントの読み込みチェックを変更し、0を "ソケットが閉じられ、ファイルの終わり"と解釈する必要があります。 – ribram