0

AndroidAsync ライブラリを使用して開かれた TCP ソケットが使用できなくなったことをクライアント側で確認する適切な方法は何ですか? これは、(プレーン TCP、非 AndroidAsync) サーバーが明示的にソケットのクローズを開始しなかった場合です (そのため、ClosedCallback は呼び出されません)。たとえば、サーバーがコールド リブートされた場合です。

DataCallback は、サーバーがデータを送り返す場合にのみ使用でき、エラー メッセージの受信には使用できないようです。

私にもそう思われる

Util.writeAll(socket, (byte[]) payload.array(), new CompletedCallback()
    {
        @Override
        public void onCompleted(Exception ex)
        {
            if (ex != null)
            {
                Log.e(TAG, "write failed with ex message= " + ex.getMessage());
                throw new RuntimeException(ex);
            }
        }
    });

例外もスローしません。

したがって、この時点では、クライアントが定期的にデータを書き込む場合でも、ソケットが使用できなくなったことを検出する方法がわかりません。

4

3 に答える 3

0

私はある種の「ping」に似た定期的なチェックを実装することになりました。クライアントは、プレーンな Java NIO ソケット呼び出し (AndroidAsync を使用しない) を使用して、まったく同じポートへの TCP 接続を開き、すぐに閉じます。その 1 つがタイムアウトした場合、接続が失われたと見なされ、再度成功すると回復が試行されます。この定期的なチェックは、アプリにフォーカスがあるとき、または起動されたばかりのときにのみ実行されます。これは明らかに理想的な回避策とはほど遠いですが、私の目的には合っているようです。

于 2016-05-24T20:13:15.350 に答える
0

IOexception十分なデータを送信するか、十分な回数呼び出すと、スローされます。両端での TCP バッファリングにより、最初の呼び出しではスローされません。

于 2016-05-11T00:24:45.593 に答える
-1

クローズド/エンドコールバックを使用できます

socket.setClosedCallback(new CompletedCallback()
{
            @Override
            public void onCompleted(Exception ex)
            {

            }
        });

socket.setEndCallback(new CompletedCallback()
{
            @Override
            public void onCompleted(Exception ex)
            {

            }
 });
于 2016-05-11T00:22:19.640 に答える