Кращі практики Socket.io з Android

Socket.IO дозволяє реалізувати в режимі реального часу двосторонню комунікацію на основі подій. Він працює на кожній платформі, браузері або пристрої, орієнтуючись однаково на надійність і швидкість. Socket.IO побудований на основі API WebSockets (сторона клієнта) та NodeJs.

Socket.IO - це не бібліотека WebSocket з можливістю резервного копіювання інших протоколів реального часу. Це спеціальна реалізація транспортного протоколу в режимі реального часу над іншими протоколами в реальному часі. Частини узгодження протоколу призводять до того, що клієнт, що підтримує стандартний WebSocket, не може зв’язатися з сервером Socket.IO.
І клієнт, що реалізує Socket.IO, не може спілкуватися з WebSocket або сервером Comet Long Polling Comet, який не базується на Socket.IO. Тому Socket.IO вимагає використання бібліотек Socket.IO як на стороні клієнта, так і на сервері.

На офіційному сайті сказано:

Socket.IO дозволяє реалізувати в режимі реального часу двосторонню комунікацію на основі подій.

Socket.IO дозволяє клієнту та серверу спілкуватися в режимі реального часу. Сервер Socket.IO NodeJs визначає події, які слід викликати на певному маршруті. Ці події прослуховуються сервером, які випромінюються клієнтами. Також сервер може випромінювати подію, яку клієнт може слухати.

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

Тоді у нас є найкраща бібліотека, створена Наоюкі Канезавою [@nkwaza].
і один офіційний Socket.IO Github для android як клієнт сервера Socket.IO.

Від вас залежить, що ви хочете вибрати як особисті переваги.
0] Socket.Io клієнт Android-Java

1] Клієнтська бібліотека Nkwaza Android Socket.IO

ви можете використовувати будь-який з них. Я б порекомендував вам Другий, оскільки він дуже зручний і легкий у використанні.
Ви можете пройти офіційний блог на сайті Socket.IO від NKwaza.

Щоб реалізувати андроїд-бібліотеку Socket.IO ідеально та бездоганно, вам слід прочитати далі.
Існує три етапи впровадження бібліотеки клієнтів SOcket.IO Android.

0. Ініціалізуйте розетку
1. Підключіть розетку до сервера
2. Почніть випускати події або слухати події

Багато разів, коли ми використовуємо Socket.IO, зазвичай виникають проблеми

1-неправильна ініціалізація, і це дає NullPointerExecption.

2- Власну подію неможливо було випромінювати та прослуховувати, оскільки сокет не підключений.

Щоб уникнути цього, спробуйте наступний підхід.

Перший крок Додайте наступну залежність у файлі build.gradle рівня програми

реалізація 'com.github.nkzawa: socket.io-client: 0.5.2'

# 0. Ініціалізація розетки

Щоб ініціалізувати сокет, створіть клас <ім'я вашої програми>, який розширює клас програми.

Дивіться фрагмент коду нижче

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

Тут, у класі додатків, оголосіть приватний сокет змінної, який ми будемо використовувати як орієнтир, який ви знаєте.
Хелперний метод getmSocket () поверне екземпляр сокета, який ми можемо використовувати у всьому нашому проекті.

# 1.Підключення розетки

Для того, щоб підключити сокет до сервера, нам потрібно використовувати метод connect () для екземпляра socket, повернутого з getmSocket ().
Всередині вашої MainActivity або будь-якої активності додайте наступний код у методі onCreate ().

MainActivity публічного класу розширює AppCompatActivity {
приватний Socket mSocket;
@Override
захищена void onCreate (пакет збереженихInstanceState) {
    super.onCreate (збереженийInstanceState);
    setContentView (R.layout.activity_main);
Додаток RatKiller = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

Щоб перевірити, встановлено чи ні, ви можете перевірити, використовуючи метод linked ().

якщо (mSocket.connected ()) {
  Toast.makeText (MainActivity.this, "Підключено !!", Toast.LENGTH_SHORT) .show ();
 }

№2. Слухайте або випромінюйте подію

Для передачі події ви можете використовувати метод emit (). Еміт () викликає подію на сервері, яку ви збираєтесь реалізувати, як натискання кнопки або відповідь на будь-які дії.

button.setOnCLickListener (view-> mSocket.emit ("вбити", отруїти об'єкт));

Для прослуховування конкретних подій, що надсилаються сервером, ми використовуємо метод (). Метод on () відкриває наданий канал і отримує відповідь від сервера.

mSocket.on ("rat_data", новий Emitter.Listener () {
    @Override
    публічний недійсний виклик (Object ... args) {
        JSONObject data = (JSONObject) аргументи [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 () {
    @Override
    публічний недійсний виклик (Object ... args) {
        JSONObject data = (JSONObject) аргументи [0];
// дані у форматі JSOn
}
});

Дані / корисне навантаження над запитом

Дані корисного навантаження запиту або дані запиту повинні бути надіслані у формат JSON у сокет. Об'єкт JSON - це вхідний параметр методу emit (). Класи JSONObject і JSONArray на Java допомагають нам побудувати формат тіла JSON даних.
Ви можете зробити це як

JSONArray toxArray = новий JSONArray ();
toxArray.put (1);
toxArray.put (2);
JSONObject toxObject = новий JSONObject ();
спробуйте {
    
    отраObject.put ("отрути", отрутаArray);
} спіймання (JSONException e) {
    e.printStackTrace ();
}

Реалізація інтерфейсу користувача

Щоразу, коли ви отримуєте дані у відповідь від сервера, вам потрібно оновлювати свій інтерфейс користувача. Для оновлення інтерфейсу користувача за допомогою отриманих даних нам потрібно виконати всю логіку прив'язки інтерфейсу користувача методом runOnUiThread ().

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

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

І зроблена проблема вирішена зараз. Так, я знаю! Я збираюся вбити цих Щурів, що бігають скрізь по підлозі.