Java で書かれたハートビート プロトコルは UDP 上で動作します
ハートビート プロトコルは、1000 ミリ秒の遅延で UDP データグラムを継続的に通知するように構成されています。ペイロード フィールドには、クライアントからの識別子 ID が含まれます。これは、ping 送信元が現在使用しているネットワーク カードの MAC アドレスなどの文字列、またはユーザー名などの識別子で構成されます。サーバーはさまざまな ping をリッスンして、識別子に従ってソートし、サーバー自身が定義するさまざまな状態を管理します。 3000 ミリ秒の遅延が経過してもクライアントから ping を受信しなかったことをサーバーが認識すると、イベントを通じてこのプロトコルのユーザーに接続喪失の可能性が通知され、他の接続を介したデータ交換を制限または停止するようアドバイスされます。 TCP などの依存プロトコル。 5,000 ミリ秒以内にこの識別子を受信すると、クライアントは再接続され、データ通信チャネルを復元できることを意味します。それ以外の場合、クライアントは完全にオフラインとみなされます。これらすべては、上記のように、以下に示すイベント管理を通じて通知されます。
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
上記のサンプル コードは、クライアントの状態に関するさまざまなイベントのキャプチャを示しています。次に、以下のように、特定の種類のイベントをキャプチャするときに何を行うかを決定するのは、リスナーを実装する人のタスクになります。
public class ServerStart implements HeartbeatListener {
private static final ServerStart thisInstance = new ServerStart ();
public static void main ( String [] args ) {
HeartbeatProtocolManager heartbeatProtocolManager = new HeartbeatProtocolManager ( thisInstance );
heartbeatProtocolManager . addHost ( "Test" , 43210 ); //identifier, port
heartbeatProtocolManager . addHost ( "Test1" , 43211 );
}
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
}
生成されるイベントには、ペイロードが含まれるだけでなく、独自のペイロード識別子と現在の ping 受信のタイムスタンプを持つ、前のイベントに対して渡された遅延も含まれます。
このプロトコルを使用すると、クライアントとサーバー間の接続ステータスをより適切に管理し、発生する可能性のあるエラーをより適切に制御できるようになります。