Protocole Heartbeat écrit en Java, fonctionnant sur UDP
Le protocole heartbeat est structuré sur une notification continue d'un datagramme UDP avec un délai de 1000 millisecondes. Le champ de charge utile contient l'identifiant du client qui peut consister en une chaîne telle que l'adresse MAC des cartes réseau actuellement utilisées par la source ping ou un identifiant tel qu'un nom d'utilisateur. Le serveur écoutera les différents ping en les triant selon l'identifiant et gérant les différents états qu'il définira lui-même. Chaque fois que le serveur remarquera qu'après un délai de 3000 millisecondes n'a reçu aucun ping du client, il informera par un événement l'utilisateur de ce protocole de la probable perte de connexion en lui conseillant de limiter ou d'arrêter l'échange de données via toute autre connexion. protocole dépendant tel que TCP. Si dans les 5 000 millisecondes vous recevez cet identifiant, le client sera à nouveau connecté, ce qui signifie qu'il est possible de restaurer le canal de communication des données. Dans le cas contraire, le client sera considéré comme complètement hors ligne. Tout cela sera notifié comme mentionné ci-dessus via une gestion d'événements comme indiqué ci-dessous :
@ 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 ());
}
L'exemple de code ci-dessus montre la capture de divers événements sur les états d'un client, ce sera alors la tâche de ceux qui implémentent l'écouteur de décider quoi faire lors de la capture d'un certain type d'événement comme ci-dessous :
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 ());
}
}
L'événement généré en plus de contenir la charge utile contiendra également le délai écoulé par rapport au précédent avec son propre identifiant de charge utile et l'horodatage de la réception actuelle du ping.
L'utilisation de ce protocole permettra une meilleure gestion de l'état des connexions entre client et serveur et un meilleur contrôle des erreurs possibles.