サーバーからイベントを読み取るクライアント側ソケット ソフトウェアを作成しています。(たとえば、株価のストリーミング)。
問題: .read(b); -1の値ですぐに返されます。これにより無限ループが発生し、電話機が非常に熱くなります。さらに、s.isConnected()、isOpen()、isBound() に対するすべてのチェックは true を返します。基本的に、ソケットは接続されているように見えます。(これはエラー シナリオであるため、.setSoTimeout(x) の値は影響しません。12 分、または空のままにします。.read(b) は常にすぐに -1 を返します)。
後で getOutputStream() を介して書き込むと、例外 EPIPE (壊れたパイプ) を受け取ります。
コア コードは次のとおりです (簡潔にするために、ログ ステートメント/値チェックは省略されています)。
s.connect(new InetSocketAddress(host, port), CONNECT_TIMEOUT_MILLIS);
byte[] b = new byte[1024];
while (s.isConnected()) {
int bytesToRead = s.getInputStream().read(b);
if (bytesToRead <= 0) {
LOGGER.debug("no bytes read? trying again.");
continue;
}
processFrame(b);
}
電話で 3g を循環させると、正常に動作します。時々、この奇妙な状態に陥ります。
質問
私は何か間違ったことをしていますか?これは予想される動作ですか?Android でソケット プログラミングを行う正しい方法を示すために参照できる既存のコードはありますか?