Яку бібліотеку WebSocket використовувати в додатку Android? [зачинено]


131

Я хочу додати Сервіс до свого додатка Android, який працює у фоновому режимі, підтримуючи з'єднання WebSocket (можливо, протягом декількох годин або навіть днів) і регулярно надсилає деякі дані на сервер.

Зараз, здається, існує маса бібліотек WebSocket для Java, і я не впевнений, яку саме я повинен використовувати:

Окрім цього, існує вбудована бібліотека клієнтів socket.io для Android:

  • nkzawa / socket.io-client.java Опис від GitHub: Повнофункціональна бібліотека клієнтів Socket.IO для Java, сумісна з Socket.IO v1.0 та новіших версій.

Користуватися клієнтом Android socket.io для мене було б зручно, тому що я все-таки планую використовувати nodejs / socket.io для веб-інтерфейсу. Але рідний клієнт досить молодий і має кілька відкритих питань. На додаток до цього, я розумію, що додаток для Android не має жодної переваги від використання клієнтської бібліотеки socket.io (крім сумісної з сервером socket.io 1.0), оскільки підтримка WebSocket може бути гарантована на стороні клієнта .

Мої вимоги такі:

  • Сумісність з Android API 9 і новішою версією
  • Можливість підключення через SSL
  • Зберігайте з'єднання тривалий час без необхідності тримати постійний будильник
  • Сумісність із доступною реалізацією сервера веб-сокетів nodejs або з socket.io

Будь-які пропозиції, яка з них є правильною бібліотекою для цих вимог?


Можливо, атмосфера . Дивіться це запитання .
Василь Бурк

2
Я не знавець у галузі WebSocket та Atmosphere. Я знаю лише, що Atmosphere добре зношена, використовується в багатьох проектах для функцій Push, включаючи підтримку WebSocket. Мій єдиний досвід - це непряме створення веб-додатків Vaadin . Ваадін використовує Атмосферу для своєї автоматичної функції Push. Але будьте обережні, WebSocket все ще відносно новий із багатьма змінами свого визначення, специфікацій та різних реалізацій протягом своєї короткої історії. Тож очікуйте "питань" незалежно від того, як ви йдете.
Василь Бурк

2
FYI, Autobahn є там, і вони мають яскравий веб-сайт. Але не помічайте, що "захищені WebSockets не реалізовані", поки ви не витратите час на встановлення та спробу запустити його. Далі.
cloudsurfin

1
У мене недостатньо репутації для коментарів, тому я пишу це як відповідь, оскільки я пережив ті самі вимоги, які ви згадали у своєму запитанні, і okhttp допомогло мені задовольнити всі вимоги. Він підтримує веб-розетки з моменту введення версії 3.5, тому його додатковою перевагою є використання okHttp (дзвінки веб-служб + підтримка веб-розеток). Ось посилання для початку. < medium.com/@ssaurel/… >
Kaleem Patel

7
Питання на кшталт цього не слід закривати.
Мартін Бергер

Відповіді:


123

Деякі примітки.

  • koush / AndroidAsync не виконує закриття рукостискання, яке вимагається RFC 6455 . Детальніше про це див.

  • Проект Tyrus працює на Android, але переконайтеся, що його ліцензія ( CDDL 1.1 та GPL 2 із CPE ) та його розмір ( Зменшення розміру банку jar-студії WebSocket за допомогою ProGuard ) відповідають вашим вимогам. Також зверніть увагу, що Tyrus може кинути виняток, коли розмір тексту великий (це, мабуть, помилка). Детальніше про це див.

  • Jetty : 2-річна нитка електронної пошти в списку розсилки користувачів jetty пише: "В даний час у нас немає сумісного з Android клієнта Jetty 9 WebSocket. Планується спроба підтримувати клієнт Jetty WebSocket від JDK 7 до JDK 5/6 для android використання, але його нижчий пріоритет, ніж закінчення нашої реалізації API JS-356 Java WebSocket (javax.websocket). " У поточному документі Jetty про API WebSocket Client нічого не згадується про Android.

  • codebutler / android-websocket не виконує закриття рукостискання, яке вимагає RFC 6455, і може кидати виняток на близьку. Дивіться це .

  • Atmosphere / wasync використовує AsyncHttpClient / async-http-клієнт в якості своєї реалізації WebSocket. Отже, замість цього слід згадати AsyncHttpClient / async-http-client.

  • firebase / TubeSock не перевіряється Sec-WebSocket-Accept. Це порушення щодо RFC 6455 . Також TubeSock має помилку у створенні текстового повідомлення. Раніше чи пізніше ви побачите помилку, якщо для текстових повідомлень будете використовувати багатобайтові символи UTF-8. Див. Випуск 3 у захваті-ім / Android-DDP, щоб отримати довгий список проблем TubeSock.

Бали розгляду

Пункти розгляду при виборі реалізації клієнтської програми WebSocket, написаної на Java:

  1. Відповідність . Невелика кількість реалізацій не реалізує рукостискання закриття, яке вимагає RFC 6455 . (Що станеться, якщо закриття рукостискання не виконане? Дивіться це .)
  2. Потрібна версія Java . Java SE 5, 6, 7, 8 чи Java EE? Працює навіть на Android?
  3. Розмір . Деякі реалізації мають багато залежностей.
  4. підтримка wss .
  5. Підтримка проксі-сервера HTTP .
  6. wss через підтримку HTTP-проксі . Див. Малюнок 2 у розділі, як взаємодія веб-сокетів HTML5 з проксі-серверами про те, що має робити клієнтська бібліотека WebSocket для підтримки wss через HTTP-проксі.
  7. Гнучкість конфігурації SSL . SSLSocketFactoryі їх SSLContextслід використовувати без зайвих обмежень.
  8. Спеціальні заголовки HTTP під час відкриття вручну , включаючи базову автентифікацію.
  9. Спеціальні заголовки HTTP в узгодженні HTTP проксі , включаючи аутентифікацію на проксі-сервері.
  10. Можливий для надсилання всіх типів кадру (продовження, двійковий, текстовий, закритий, пінг та понг) чи ні. Більшість реалізацій не надають розробникам засобів для надсилання фрагментованих кадрів та небажаних понг-кадрів вручну.
  11. Інтерфейс слухача для отримання різних подій WebSocket. Неправильний інтерфейс засмучує розробників. Багатий інтерфейс допомагає розробникам писати надійні програми.
  12. Здатний запитувати стан WebSocket чи ні. RFC 6455 визначає стани ЗВ'ЯЗКУВАННЯ , ВІДКРИТТЯ, ЗАКРИТТЯ та ЗАКРИТИ, але мало реалізацій підтримують свій внутрішній перехід стану визначеним чином.
  13. Можливість встановити значення тайм-ауту для підключення розетки . (Еквівалент другому аргументу методу)Socket.connect(SocketAddress endpoint, int timeout)
  14. Можливість доступу до основної розетки .
  15. Інтуїтивно зрозумілий простий у користуванні API чи ні.
  16. Добре задокументовано чи ні.
  17. Підтримка RFC 7692 (розширення стиснення для WebSocket) (так само пронизування-дефляція).
  18. Підтримка перенаправлення (3xx).
  19. Підтримка аутентифікації .

nv-websocket-client охоплює все вище, крім двох останніх. Крім того, одна з його невеликих, але зручних функцій - періодично надсилати кадри для пінг / понг. Це можна досягти лише за допомогою викликуsetPingInterval/setPongIntervalметодів (Див. JavaDoc ).

Відмова: Takahiko Kawasaki є автором nv-websocket-клієнта.


1
чи все ще розробляється бібліотека nv-websocket-client? Я зіткнувся з проблемою автоматичного відключення з TooTallNate / Java-WebSockets з помилкою 1006 та відсутністю причин. Чи ця проблема nv-websocket також її вирішує?
Анкіт Бансал

1
Що стосується 1006, специфікація (RFC 6455) зазначає, що код НЕ МОЖЕТ бути встановлений як код статусу в кадрі закритого керування за допомогою кінцевої точки . Це означає, що код був створений на стороні клієнта. Ви можете отримати більше інформації про відключення за допомогою onDisconnectedметоду та onErrorметоду WebSocketListener . onErrorметод дає вам WebSocketExceptionпримірник. Зателефонуйте до його getError()методу, щоб побачити, у чому проблема.
Такахіко Кавасакі

7
Щодо wss, я спробував okhttp та autobahn (також підозрюваний у саморекламі у цій відповіді). Автобан був легким, але не має SSL. OkHttp має майже нульову (консолідовану) документацію (лютий 2016). Я витрачав багато часу, читаючи їх код та їх винятки, тому що я не був прихильним до обхідних шляхів (наприклад, встановив час очікування на 0 або закрив вхідне повідомлення), щоб отримати приклад голих кісток. Скинувши ці два (і моє розчарування), я виявив, що НВ (освіжаюче) добре задокументовано; це працювало без суєти.
cloudsurfin

1
Будь-які думки щодо нової веб-розетки Square / okhttp? medium.com/square-corner-blog/…
scorpiodawg

2
Я не знаю деталей про OkHttp. Вибачте, що я настільки зайнятий, як засновник Authlete, Inc. (" API запуску безпеки Authlete збирає 1,2 млн. Доларів за рахунок насіннєвого фінансування "). Я не можу витратити час, щоб заглянути в OkHttp та оновити список пунктів розгляду. Щодо змін після моєї відповіді, див. ЗМІНИ.md . Зверніть увагу, що nv-websocket-client - це лише моє захоплення, тоді як OkHttp здається великим проектом із 138 учасниками.
Такахіко Кавасакі

4

Деякі інші міркування:

Tyrus працює на Android. Однак бібліотеки SSL, якими він користується в Android 5.0, виявляються непотрібними і не працюють із рукостисканням SSL . Це має бути виправлено у нових версіях Android, але з тим, що Android не оновлюється на багатьох пристроях, це може бути проблемою для вас.

Залежно від того, як реалізовано SSL для інших реалізацій веб-сокетів, це також може бути проблемою.

AndroidAsync не має цієї проблеми з SSL. У нього є інші проблеми, такі як неможливість встановлення тайм-аутів .


3

а) Додайте цей файл у файл gradle

compile 'com.github.nkzawa:socket.io-client:0.3.0'

b) Додайте ці рядки до активності програми:

    public class MyApplication extends Application {
     private Socket mSocket;
        {
            try {
               mSocket = IO.socket(Config.getBaseURL());

            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }

        public Socket getSocket() {
            return mSocket;
        }
}

c) Додайте цю функцію до своєї діяльності, де ви назвали WebSocket:

     private void websocketConnection() {
            //Get websocket from application
            MyApplication app = (MyApplication ) getApplication();
            mSocket = app.getSocket();
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
            mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
            mSocket.on("messageFromServer", onNewLocation);
            mSocket.connect();
        } 


    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(() -> {
                if (!isConnected) {

                    RequestSocket mRequestSocket = new RequestSocket();

                    mRequestSocket.setToken("anil_singhania");
                   /* your parameter */
                    mSocket.emit("messageFromClient", new Gson().toJson(mRequestSocket));
                    Log.i("Socket Data", new Gson().toJson(mRequestSocket));
                    isConnected = true;
                }
            });
        }
    };

    private Emitter.Listener onDisconnect = args -> runOnUiThread(() -> {
        isConnected = false;
       /* Toast.makeText(getApplicationContext(),
                R.string.disconnect, Toast.LENGTH_LONG).show();*/
    });

    private Emitter.Listener onConnectError = args -> runOnUiThread(() -> {
         /*   Toast.makeText(getApplicationContext(),
            R.string.error_connect, Toast.LENGTH_LONG).show()*/
    });

    private Emitter.Listener onNewLocation = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            runOnUiThread(() -> {


            });
        }
    };

Це не підтримує протокол ws: //.
Гіріш Бхутія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.