0

Android のソケット ストリーム接続で奇妙な動作を認識しました。なぜJavaと違うのか知りたいです。

私の中で私はホストへの接続のためにとAsyncTaskを開きます。ホストがなくなったか、まだ利用可能かどうかを確認する方法に取り組んでいます。そのため、接続が利用可能かどうかを確認するスレッドを開始します。client socketinputstreambufferedreaderTCP

ホストがなくなった場合、スレッドは再接続の可能性のために asynctask のソケットを閉じます。それはうまく機能していて、誇りに思っていますが、今は難しい部分です。

Java ではソケットを閉じることができSocket.close()、ブロックしている readline メソッドは例外によってキャッチされます。

Android ではSocket.shutdownInput()、readline ブロックを壊してexception. inputstream( )を閉じようとしてもBufferedReader、この場合は効果がないためです。ソケットを閉じても、readline はまだアクティブでブロックされています。

誰でもこの動作を説明できますか? 終了条件に固執する必要があることはわかっていますが、この動作は非常に異なります。

編集:リンクの yorkw への Thx。Froyo が私の電話で実行されているため、まったく同じ問題です。

4

1 に答える 1

0

Android 側とサーバー側の両方で SO_LINGER 時間を確認してみてください。理想的には、Android の SO_LINGER + サーバーの SO_LINGER の後に、サーバー側で IOException を取得する必要があります。これで非同期タスクが実際にソケットを閉じているかどうかを実際に確認するのに役立たない場合は、同じアクティビティを何度も実行してみて、開いているファイルの最大数を超えたことを示す例外が発生するかどうかを確認してください。少なくとも、問題は Android 側にあることがわかります。

于 2012-09-17T14:49:08.963 に答える