ものすごく久々にJavaのコードを書いた。
コードを書いたのは大学の上級プログラミング(笑)以降かな。
まずは以下をご覧ください。(解像度が高すぎて文字が小さすぎるため、HD以上でご覧ください)
複数人のクライアントを扱うまでは簡単。
しかし問題なのはクライアントとの切断が検知できないため、切断してもその人のソケット変数が残ってしまう。
今回はそれを検知し、クローズしたソケットを自動的に削除するようにした。
ここで紹介するのは切断の検知方法だけにしておく。
あ、先に言っておくと、isClosed()やisConnected()では検知できません。
接続したらisConnectedがTrueに。close()により切断されたソケットはisClosed()でtrueが買えるようになっていて、接続状態を確認するものではありません。
サーバーと接続したクライアントアプリケーションが異常終了やCloseを使わずに切断された場合の検知は以下のように行うことができます。(かなり非効率ですが)
まずメインでデータのやり取りを行うソケット以外にもう一つ別のポートで通信状態をチェックします。
ソケット接続が確立したらソケットを閉じる。接続にはsetSoTimeoutで一定のタイムアウト時間を設定しておく。
これをループすることでクライアントが接続可能な状態かどうかを判断することができます。
タイムアウトしなければソケットを確立した瞬間破棄し、再接続を試します。
タイムアウトした場合そのネットワークは切断されているということが言えます。
クラスにまとめてDropBoxにアップロードしておきます。JavaDocはそのうち書きます。
これはもちろんサーバーサイド用とクライアントサイドで分ける必要があります。
両方とも、新しくオブジェクトをnewした瞬間から動作します。
サーバー側のファイル(ServerConnectionCheck)
void ServerConnectionCheck(String host, int port) //コンストラクタ
boolean isConnecting() //接続しているかどうか
void close() //終了
クライアント側のファイル(ClientConnectionCheck)
void ClientConnectionCheck(String host, int port) //コンストラクタ
void close() //終了
リンク切れの場合はご報告ください。
「Javaのソケット通信の切断を検知」への3件の返信
ありがとうございます。
とても勉強になります。
これからも参考にさせて頂きたいと思います。
あ、申し訳ありません。
別の方法での解決策を書いているのでそちらをご参照ください。
http://axe1lyze.blogspot.com/2011/12/javasocket.html
JavaでSocketの状態を監視するプログラムを作ろうと思って、色々探していたらこちらのサイトに着きました。
参考にさせて頂こうかと思ったのですが
リンクが切れてしまっています。
再度公開して頂けると良いのですが。