بروتوكول نبضات القلب مكتوب بلغة Java، ويعمل عبر UDP
تم بناء بروتوكول نبضات القلب على إشعار مستمر لمخطط بيانات UDP مع تأخير قدره 1000 مللي ثانية. يحتوي حقل الحمولة على معرف المعرف من العميل الذي يمكن أن يتكون من سلسلة مثل عنوان MAC لبطاقات الشبكة المستخدمة حاليًا بواسطة مصدر ping أو معرف مثل اسم المستخدم. سوف يستمع الخادم إلى أوامر ping المختلفة ويفرزها وفقًا للمعرف ويدير الحالات المختلفة التي سيحددها بنفسه. عندما يلاحظ الخادم أنه بعد تأخير قدره 3000 مللي ثانية لم يتلق أي اختبار اتصال من العميل، فسوف يقوم بإخطار مستخدم هذا البروتوكول من خلال حدث باحتمال فقدان الاتصال مع تقديم المشورة للحد من أو إيقاف تبادل البيانات من خلال أي اتصال آخر- البروتوكول التابع مثل TCP. إذا تلقيت هذا المعرف خلال 5000 مللي ثانية، فسيتم توصيل العميل مرة أخرى، مما يعني أنه من الممكن استعادة قناة اتصال البيانات. وإلا فسيتم اعتبار العميل غير متصل بالإنترنت تمامًا. كل ذلك سيتم الإخطار به كما ذكرنا أعلاه من خلال إدارة الحدث كما هو موضح أدناه:
@ 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.
سيسمح استخدام هذا البروتوكول بإدارة أفضل لحالة الاتصالات بين العميل والخادم والتحكم بشكل أكبر في الأخطاء المحتملة.