2011-06-29 1 views
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です。

ありがとうございます。

+0

ファイルの送信が完了したら、サーバー側でソケットが閉じられますか?接続が開いたままの場合は、クライアントの読み取りが期待どおりに動作していない可能性があります。 read()またはbytes()を0にして回転をブロックしているかどうかを知っていますか? – ribram

+0

サーバー上のソケットが閉じません。私はタイムアウト設定を削除しました。私はdebuuggingでそれをもう一度見て、それは完全にファイルを受信するようだが、最後の読み取りを行うとき、受信するバイトがないとき、それはブロックする。どのようにしてそれを防ぐことができますか? – elxordi

+0

出力ストリームを閉じるとそれを行うかどうかは分かりませんが、そうでない場合はソケットのclose()が明示的に行われています。サーバー側のソケットを閉じると、クライアントの読み込みが0になるはずです。読み込みが0より大きい場合にクライアントの読み込みチェックを変更し、0を "ソケットが閉じられ、ファイルの終わり"と解釈する必要があります。 – ribram

答えて

0

完了しました。私が見つけた唯一の方法は、最初にファイルの長さをクライアントに送信し、保存してから、(現在のコードで)< fileLengthの間にread()を実行することです。

関連する問題