Най-добри практики на Socket.io с Android

Socket.IO позволява двустранна комуникация в реално време, базирана на събития. Работи на всяка платформа, браузър или устройство, като се фокусира еднакво върху надеждността и скоростта. Socket.IO е изграден върху API на WebSockets (клиентска страна) и NodeJs.

Socket.IO не е библиотека на WebSocket с резервни опции към други протоколи в реално време. Това е персонализирана реализация на транспортен протокол в реално време върху други протоколи в реално време. Неговите части за договаряне на протокол карат клиент, поддържащ стандартен WebSocket, да не може да се свърже със Socket.IO сървър.
И реализиращият Socket.IO клиент не може да разговаря с WebSocket, базиран на не-Socket.IO или сървъра за комета с дълги огледи. Следователно, Socket.IO изисква използването на библиотеките Socket.IO от страна на клиента и на сървъра.

Официалният сайт казва:

Socket.IO позволява двустранна комуникация в реално време, базирана на събития.

Socket.IO дава възможност на клиента и сървъра да комуникират в реално време. Сървърът Socket.IO NodeJs дефинира събитията, които трябва да се задействат по конкретен маршрут. Тези събития се слушат от сървър, който се излъчва от клиентите. Също така сървърът може да излъчва събитие, което клиентът може да слуша.

Socket.IO може лесно да се реализира през уеб приложения, използвайки NodeJs сървър като бек-енд. Но в случай на Android?

Тогава имаме най-добра библиотека, създадена от Naoyuki Kanezawa [@nkwaza].
и един от официалния Socket.IO Github за android като клиент на Socket.IO сървър.

От вас зависи какво искате да изберете като свое лично предпочитание.
0] Socket.Io Android-Java клиент

1] Nkwaza Android Socket.IO библиотека за клиенти

можете да използвате някое от тях. Бих ви препоръчал Вторият, защото е много удобен и леко лесен за използване.
Можете да преминете през официалния блог на сайта Socket.IO от NKwaza.

За да внедрите андроид библиотеката Socket.IO по перфектен и безупречен начин, трябва да прочетете допълнително.
Има три стъпки за внедряване на библиотека на клиент на Android SOcket.IO.

0. Инициализирайте гнездото
1. Свържете гнездото към сървъра
2. Започнете да излъчвате събития или слухови събития

Много пъти, когато използваме Socket.IO, обикновено възникват проблемите

1-Неправилна инициализация и тя дава NullPointerExecption.

2- Правилното събитие не може да бъде излъчено и прослушано, тъй като гнездото не е свързано.

За да избегнете това, опитайте следния подход.

Първа стъпка Добавете следната зависимост във файла на build.gradle на ниво приложение

внедряване „com.github.nkzawa: socket.io-client: 0.5.2“

# 0. Инициализиране на гнездото

За да активирате гнездото, създайте клас , който разширява класа на Application.

Вижте фрагмента на кода по-долу

импортиране на android.app.Application;
импортиране com.github.nkzawa.socketio.client.IO;
импортиране на com.github.nkzawa.socketio.client.Socket;
import java.net.URISyntaxException;
публичен клас RatKiller разширява приложението {
    частен Socket mSocket;
    частен статичен краен низ URL = "http://yoururl.com";
    @Override
    публична невалидност onCreate () {
        super.onCreate ();
        опитвам {
            mSocket = IO.socket (URL);
        } улов (URISyntaxException e) {
            хвърлете нова RuntimeException (e);
        }
    }
   обществен Socket getmSocket () {
     връщане mSocket;
   }
}

Тук, в класа на приложения, декларирайте частен сокет с променлива, който ще използваме като референция, която знаете.
Помощният метод getmSocket () ще върне екземпляра на сокета, който можем да използваме в целия ни проект.

# 1.Свързване на контакта

За да свържем сокета към сървъра, трябва да използваме метода connect () в екземпляра socket, върнат от getmSocket ().
Вътре в MainActivity или каквато и да е дейност добавете следния код в метода onCreate ().

MainActivity в обществен клас разширява AppCompatActivity {
частен Socket mSocket;
@Override
защитена void onCreate (пакет запазенInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);
Приложение RatKiller = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

За да проверите дали връзката е установена или не, можете да проверите с помощта на метод свързан ().

ако (mSocket.connected ()) {
  Toast.makeText (MainActivity.this, "Свързани !!", Toast.LENGTH_SHORT) .show ();
 }

# 2. Слушайте или излъчвайте събитие

За да излъчвате събитие можете да използвате метод emit (). Emit () задейства събитие на сървъра, което ще внедрите като натискане на бутон или отговор на действия.

button.setOnCLickListener (панорама-> mSocket.emit ( "убие", poisonObject));

За да слушаме конкретни събития, изпратени от сървъра, използваме метода (). Методът on () отваря предоставен канал и получава отговора от сървъра.

mSocket.on ("rat_data", нов Emitter.Listener () {
    @Override
    публичен невалиден разговор (обект ... аргументи) {
        JSONObject data = (JSONObject) аргументи [0];
// тук данните са във формат JSON
        //Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}
});

Понякога трябва да слушате реакцията на определени събития, които клиентът / приложението ще задейства или чрез натискане на бутон, или всяко действие, задействано и т.н.
В такива случаи можем да извикаме метода on () over emit (). Методът emit () ще задейства някакво събитие по определен маршрут / канал и on () веднага ще изслуша отговора, изпратен от сървъра.
Можете да постигнете това, като направите нещо подобно

mSocket.emit ("get_rat_data"). on ("rat_data", нов Emitter.Listener () {
    @Override
    публичен невалиден разговор (обект ... аргументи) {
        JSONObject data = (JSONObject) аргументи [0];
// данните са във формат JSOn
}
});

Данни / полезен товар над заявка

Данните за полезния товар или данните на тялото на заявката трябва да бъдат изпратени във формат JSON към сокет. JSON Object е входният параметър на метода emit (). Java клас JSONObject и JSONArray ни помага да изградим JSON формат на тялото на данните.
Можете да направите това като

JSONArray toxArray = нов JSONArray ();
poisonArray.put (1);
poisonArray.put (2);
JSONObject toxObject = нов JSONObject ();
опитвам {
    
    poisonObject.put ( "отрови", poisonArray);
} улов (JSONException e) {
    e.printStackTrace ();
}

Изпълнение на потребителския интерфейс

Всеки път, когато получавате данните като отговор от сървъра, трябва да актуализирате потребителския си интерфейс. За да актуализираме потребителския интерфейс, използвайки получени данни, трябва да изпълним цялата логика на свързване на потребителския интерфейс по метода runOnUiThread ().

Методът call () от Emmiter.Listener {…} използва за работа върху фонова нишка. Ако се опитате да извикате специфичния за потребителския интерфейс метод в разговора, той ще се взриви чрез взривяване на любимите ни изключения по време на изпълнение.
Можете да постигнете това, като се обадите на метод runOnUiThread (Runnable r).

mSocket.emit ("убивам", отровен обект) .on ("rat_data", нов Emitter.Listener () {
    @Override
    публичен невалиден разговор (обект ... аргументи) {
     JSONObject data = (JSONObject) аргументи [0];
// данните са във формат JSOn
     runOnUiThread (нов Runnable () {
         @Override
         публично невалидно изпълнение () {
           Toast.makeText (MainActivity.this, "Хаха !! Всички плъхове са убити!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ( "0");
          // каквато и да е вашата логика на потребителския интерфейс
         }
     });
    }
});

И готово проблемът е решен сега. Да, знам! Ще убия онези Плъхове, които тичат навсякъде по пода.