أفضل ممارسات Socket.io مع Android

يتيح Socket.IO الاتصال القائم على الأحداث في الوقت الحقيقي. إنه يعمل على كل منصة أو متصفح أو جهاز ، مع التركيز بشكل متساو على الموثوقية والسرعة. Socket.IO مبني على واجهة WebSockets API (جانب العميل) و NodeJs.

Socket.IO ليست مكتبة WebSocket مع خيارات احتياطي لبروتوكولات الوقت الحقيقي الأخرى. إنه تطبيق بروتوكول نقل حقيقي مخصص على رأس بروتوكولات الوقت الفعلي الأخرى. تتسبب أجزاء تفاوض البروتوكول الخاصة به في عدم تمكن عميل يدعم WebSocket القياسي من الاتصال بخادم Socket.IO.
كما يتعذر على عميل تطبيق Socket.IO التحدث إلى خادم WebSocket أو Long Polling Comet الذي لا يعتمد على Socket.IO. لذلك ، يتطلب Socket.IO استخدام مكتبات Socket.IO على كل جانب العميل والخادم.

الموقع الرسمي يقول ،

يتيح Socket.IO الاتصال القائم على الأحداث في الوقت الحقيقي.

تمكن Socket.IO العميل والخادم من التواصل في الوقت الحقيقي. يعرّف خادم Socket.IO NodeJs الأحداث التي سيتم تشغيلها على مسار محدد. يتم الاستماع إلى هذه الأحداث بواسطة خادم يتم إصداره من قبل العملاء. وأيضًا ، يمكن للخادم أن ينبعث حدثًا يمكن للعميل الاستماع إليه.

يمكن تطبيق Socket.IO بسهولة على تطبيقات الويب باستخدام خادم NodeJs كخلفية. ولكن في حالة Android؟

ثم لدينا أفضل مكتبة أنشأتها Naoyuki Kanezawa [@ nkwaza].
وواحد من قبل Socket.IO Github الرسمي لالروبوت كعميل لخادم Socket.IO.

يعتمد عليك ما تريد أن تختاره كتفضيلك الشخصي.
0] Socket.Io Android-Java client

1] مكتبة العميل Nkwaza Android Socket.IO

يمكنك استخدام أي منهما. أنصحك بالثاني لأنه سهل الاستخدام و سهل الاستخدام.
يمكنك الاطلاع على المدونة الرسمية على موقع Socket.IO بواسطة NKwaza.

لتنفيذ مكتبة Android Socket.IO بطريقة مثالية لا تشوبها شائبة ، يجب عليك قراءة المزيد.
هناك ثلاث خطوات لتنفيذ مكتبة SOcket.IO Android Client.

0. تهيئة المقبس
1. قم بتوصيل المقبس بالخادم
2. بدء انبعاث الأحداث أو الاستماع إلى الأحداث

في كثير من الأحيان عندما نستخدم Socket.IO المشاكل التي تواجهها عموما

1-تهيئة غير صحيحة ويعطي NullPointerExecption.

2 - لا يمكن إطلاق الحدث المناسب والاستماع إليه لأن المقبس غير متصل.

لتجنب هذا حاول النهج التالي.

الخطوة الأولى جدًا أضف التبعية التالية في ملف build.gradle على مستوى التطبيق الخاص بك

التنفيذ ‘com.github.nkzawa: socket.io-client: 0.5.2 '

# 0. تهيئة المقبس

لتهيئة المقبس ، قم بإنشاء فصل <اسم التطبيق> يمتد فئة التطبيق.

انظر مقتطف الشفرة أدناه

استيراد android.app.Application ؛
import com.github.nkzawa.socketio.client.IO؛
استيراد com.github.nkzawa.socketio.client.Socket؛
استيراد java.net.URISyntaxException ؛
الطبقة العامة RatKiller يمتد التطبيق {
    مقبس خاص mSocket.
    عنوان URL النهائي الثابت الخاص في السلسلة = "http://yoururl.com"؛
    @تجاوز
    باطل عام onCreate () {
        super.onCreate ()؛
        محاولة {
            mSocket = IO.socket (URL) ؛
        } catch (URISyntaxException e) {
            رمي RuntimeException (e) الجديد ؛
        }
    }
   المقبس العام getmSocket () {
     عودة mSocket.
   }
}

هنا في فئة التطبيق ، أعلن مأخذ توصيل متغير خاص والذي سنستخدمه كمرجع تعرفه.
تقوم getmSocket () بإرجاع طريقة المساعد إلى مثيل مأخذ التوصيل الذي يمكننا استخدامه في مشروعنا بالكامل.

# 1.توصيل المقبس

من أجل توصيل المقبس بالخادم ، نحتاج إلى استخدام طريقة connect () على مثيل مأخذ التوصيل الذي تم إرجاعه من طريقة getmSocket ().
داخل MainActivity الخاص بك أو أي نشاط ، أضف التعليمات البرمجية التالية في طريقة onCreate ().

MainActivity فئة عامة يمتد AppCompatActivity {
مقبس خاص mSocket.
@تجاوز
محمي void onCreate (تم حفظ الحزمة في InstanceState) {
    super.onCreate (savedInstanceState)؛
    setContentView (R.layout.activity_main)؛
تطبيق RatKiller = (RatKiller) getApplication () ؛
    mSocket = app.getmSocket () ؛
    //
    //
    // ...
}

للتحقق مما إذا كان قد تم إنشاء اتصال أم لا ، يمكنك التحقق باستخدام طريقة متصلة ().

if (mSocket.connected ()) {
  Toast.makeText (MainActivity.this ، "Connected !!" ، Toast.LENGTH_SHORT) .show ()؛
 }

# 2. استمع أو أرسل حدثًا

لإرسال حدث ، يمكنك استخدام طريقة emit (). تقوم emit () بتشغيل حدث على الخادم الذي ستنفذه بنقرة زر أو أي استجابة إجراءات.

button.setOnCLickListener (عرض-> mSocket.emit ( "قتل"، poisonObject))؛

للاستماع إلى أحداث معينة يتم إرسالها بواسطة الخادم ، نستخدم الطريقة (). يفتح الأسلوب on () قناة مقدمة ويتلقى الرد من الخادم.

mSocket.on ("rat_data" ، Emitter.Listener () الجديد
    @تجاوز
    استدعاء الفراغ العام (Object ... args) {
        بيانات JSONObject = (JSONObject) args [0]؛
// هنا البيانات بتنسيق JSON
        //Toast.makeText(MainActivity.this، data.toString ()، Toast.LENGTH_SHORT) .show ()؛
}
})؛

في بعض الأحيان تحتاج إلى الاستماع إلى استجابة بعض الأحداث التي سيقوم العميل / التطبيق بتشغيلها إما عن طريق النقر فوق الزر أو أي إجراء يتم تنفيذه وما إلى ذلك.
في مثل هذه الحالات ، يمكننا استدعاء الأسلوب on () عبر طريقة emit (). ستؤدي طريقة emit () إلى تشغيل بعض الأحداث على مسار / قناة محددة ، وسوف يستمع on () فورًا إلى الاستجابة التي يرسلها الخادم.
يمكنك تحقيق ذلك عن طريق القيام بشيء مثل

mSocket.emit ("get_rat_data"). on ("rat_data" ، Emitter.Listener () الجديد
    @تجاوز
    استدعاء الفراغ العام (Object ... args) {
        بيانات JSONObject = (JSONObject) args [0]؛
// البيانات بتنسيق JSOn
}
})؛

البيانات / الحمولة الزائدة على الطلب

يجب إرسال بيانات الحمولة النافعة للطلب أو نص الطلب بتنسيق JSON إلى المقبس. كائن JSON هو معلمة إدخال أسلوب emit (). يساعدنا صف JSONObject و JSONArray من Java على إنشاء تنسيق نص JSON للبيانات.
يمكنك القيام بذلك كما

JSONArray poisonArray = جديد JSONArray ()؛
poisonArray.put (1)؛
poisonArray.put (2)؛
JSONObject poisonObject = جديد JSONObject ()؛
محاولة {
    
    poisonObject.put ( "السموم"، poisonArray)؛
} catch (JSONException e) {
    e.printStackTrace ()؛
}

تنفيذ واجهة المستخدم

في كل مرة تتلقى البيانات كرد من الخادم ، تحتاج إلى تحديث واجهة المستخدم الخاصة بك. لتحديث واجهة المستخدم باستخدام البيانات المستلمة ، نحتاج إلى تنفيذ كل منطق ربط واجهة المستخدم على طريقة runOnUiThread ().

تستخدم طريقة call () من Emmiter.Listener {…} للعمل على سلسلة رسائل في الخلفية. إذا حاولت الاتصال بالطريقة المحددة لواجهة المستخدم داخل المكالمة ، فسيتم تفجيرها عن طريق تفريغ استثناءات وقت التشغيل المفضلة لدينا.
يمكنك تحقيق ذلك عن طريق استدعاء أسلوب runOnUiThread (Runnable r).

mSocket.emit ("kill"، poisonObject) .on ("rat_data"، Emitter.Listener () الجديد
    @تجاوز
    استدعاء الفراغ العام (Object ... args) {
     بيانات JSONObject = (JSONObject) args [0]؛
// البيانات بتنسيق JSOn
     runOnUiThread (جديد Runnable () {
         @تجاوز
         تشغيل الفراغ العام () {
           Toast.makeText (MainActivity.this ، "Haha !! تم قتل جميع الفئران!" ، Toast.LENGTH_SHORT) .show ()؛
          ratTextView.setText ( "0")؛
          // مهما كان منطق واجهة المستخدم لديك
         }
     })؛
    }
})؛

وفعلت يتم حل المشكلة الآن. نعم اعرف! سأقتل هؤلاء الفئران وهم يركضون في كل مكان على الأرض.