ものすごく久々に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() //終了
リンク切れの場合はご報告ください。