2017-01-25 7 views
1

私はApacheのTelnetClientを使ってtelnet接続を開くAndroidアプリを作っています。このため、私はRunnableを作成しました。これはいつまでもprocessInput()で読み続けるでしょう。ソケットがまだ接続されている場合はisConnected()でチェックし、そうでなければ、実行可能ファイルから戻り、リスナーのonDisconnected()を呼び出します。しかし、この最後の方法は、私がWi-Fiを起動しても呼び出されることはありません。AndroidでApache SocketClientの接続喪失を検出する方法は?

Wi-Fiの状態を確認することはできますが、サーバーがハングアップしたり、他の理由で接続が失われたりすることはありません。接続が閉じられたときはどうすれば検出できますか?

private class ClientThread implements Runnable { 
    @Override 
    public void run() { 
     while (true) { 
      if (!client.isConnected()) { 
       for (NewRecordListener listener : listeners) 
        listener.onDisconnected(); 

       try { client.disconnect(); } catch (IOException e) {} 

       return; 
      } 

      try { 
       processInput(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

"ソケットがまだ接続されている場合はisConnected()でチェックします" - できません。 "戻り値: ソケットがサーバに正常に接続されている場合はtrue" - 接続が切断されるとすぐにfalseになることを必ずしも意味しません。 – Fildor

+0

「接続が閉じられたときの検出方法」 - 正常でない接続の中止の場合、ほとんどの場合、書き込みを試みている間にIOExceptionが発生する可能性があります。 – Fildor

+0

定期的に[AreYouThere](https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/telnet/TelnetClient.html#sendAYT(long))を使用することができます。 – Fildor

答えて

1

あなたがすることはできません "私はソケットがまだ接続されている場合をisConnected()に確認してください":

"戻り値:真のソケットがsuccessfulyサーバーに接続している場合、"

は、接続が切断されるとすぐにfalseになることを必ずしも意味しません。

非優雅な接続で

  • を書き込もうとしているときにIOExceptionを得るチャンスがほとんど唯一の存在である中止「の接続が閉じているときに、私は検出するにはどうすればよいです」。
  • 定期的にAreYouThereを使用します。

追記:クライアントが現在サーバーに接続されている場合

trueを返します:

私は、このdocがあると言うように誘惑しています。

は間違っています。ドキュメントJava 6のSocket.isConnectedれ、この方法は、代表者のことを言っていないためにに:

戻り値: 真ソケットがsuccessfulyサーバに接続された場合は、Java TCPソケット実装の

典型的な行動isConnectedは、ソケットが正常に接続されたときにtrueを返します。とそれに続いてが続きます。

https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html#isConnected--参照:

注:ソケットを閉じると、このメソッドがクローズソケットに対してtrueを返すことを意味し、その接続状態、... "のためだ

をクリアしていませんしかし、Java 8では、ノートを追加したばかりか、動作が変更されたかどうかは分かりませんが、最初は疑問です。

関連する問題