Я хочу добавить службу в свое приложение для Android, которое работает в фоновом режиме с подключением WebSocket (возможно, в течение нескольких часов или даже дней) и регулярно отправляет некоторые данные на сервер.
Теперь, похоже, есть куча библиотек WebSocket для Java, и я не уверен, какую из них мне следует использовать:
TooTallNate / Java-WebSocket Описание с GitHub: базовая реализация клиента и сервера WebSocket, написанная на 100% Java. http://java-websocket.org/ - это ссылка в моем первом результате поиска в Google "android websocket" . Однако у него довольно много открытых проблем, особенно с SSL-соединениями, и, похоже, в настоящее время он не поддерживается активно.
koush / AndroidAsync Описание с GitHub: асинхронный сокет, http (клиент + сервер), websocket и библиотека socket.io для android. На основе nio, а не потоков. - Снова много открытых вопросов, но, похоже, они активно поддерживаются / работают.
Описание проекта Tyrus с веб-сайта: JSR 356: Java API для WebSocket - эталонная реализация - это сделано Oracle. Не уверен, работает ли он в Android.
Информация об API клиента Jetty WebSocket с веб-сайта: Jetty также предоставляет клиентскую библиотеку Jetty WebSocket для записи, которая упрощает взаимодействие с серверами WebSocket. - Еще раз: не уверен, работает ли он в Android.
codebutler / android-websockets Описание с GitHub: Клиент с минимальным минимальным количеством веб-сокетов (hybi13 / RFC) для Android - он используется в schwiz / android-websocket-example , который является принятым ответом на вопрос StackOverflow « Как сделать Android-устройство поддерживает TCP-соединение с Интернетом без блокировки пробуждения? ".
Atmosphere / wasync Описание с GitHub: WebSockets с резервной клиентской библиотекой транспорта для Node.js, Android и Java http://async-io.org
TakahikoKawasaki / nv-websocket-client Описание с GitHub: Качественная реализация клиента WebSocket на Java.
square / okhttp Описание с GitHub: клиент HTTP + SPDY для приложений Android и Java. http://square.github.io/okhttp/ -
имеет модуль Websocket .Как упоминал scorpiodawg , OkHttp имеет встроенную поддержку веб-сокетов, начиная с версии 3.5.firebase / TubeSock Описание с GitHub: клиентская библиотека WebSocket, реализованная на Java
Autobahn | Android ( GitHub ) Описание с веб-сайта: Autobahn | Android - это сетевая библиотека с открытым исходным кодом для Java / Android, созданная проектом Autobahn, который реализует протокол WebSocket и протокол обмена сообщениями веб-приложений (WAMP) для создания собственного мобильного WebSocket / WAMP клиентов. - cloudurfin указал, что здесь нет поддержки wss.
Кроме того, есть собственная клиентская библиотека 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
- Сохраняйте соединение в течение длительного времени без необходимости удерживать постоянный wakelock
- Совместимость с доступной реализацией сервера nodejs websocket или с socket.io
Есть предложения, какая библиотека подходит для этих требований?
Ответы:
Некоторые примечания.
koush / AndroidAsync не выполняет закрывающее рукопожатие, требуемое RFC 6455 . Смотрите это для деталей.
Project Tyrus работает на Android, но убедитесь, что его лицензия ( CDDL 1.1 и GPL 2 с CPE ) и его размер ( уменьшение размера клиентского jar-файла WebSocket с помощью ProGuard ) соответствуют вашим требованиям. Также обратите внимание, что Tyrus может вызвать исключение, если размер текста большой (вероятно, это ошибка). Смотрите это для деталей.
Jetty : 2 года назад в электронном потоке в списке рассылки пользователей причала говорится: «В настоящее время у нас нет Android-совместимого клиента Jetty 9 WebSocket. Есть планы попытаться выполнить обратный перенос клиента Jetty WebSocket с JDK 7 на JDK 5/6 для Android. использовать, но это более низкий приоритет, чем завершение нашей реализации JSR-356 Java WebSocket API (javax.websocket) ". В текущем документе Jetty о его API-интерфейсе WebSocket Client ничего не упоминается об Android.
codebutler / android-websocket не выполняет рукопожатие закрытия, которое требуется по RFC 6455, и может вызывать исключение при закрытии. Смотрите это .
Atmosphere / wasync использует AsyncHttpClient / async-http-client в качестве реализации WebSocket. Поэтому вместо этого следует упомянуть AsyncHttpClient / async-http-client.
firebase / TubeSock не проверяет
Sec-WebSocket-Accept
. Это нарушение RFC 6455 . Также в TubeSock есть ошибка при построении текстового сообщения. Вы столкнетесь с ошибкой рано или поздно, если будете использовать многобайтовые символы UTF-8 для текстовых сообщений. См. Выпуск 3 в delight-im / Android-DDP для получения длинного списка проблем с TubeSock.Пункты рассмотрения
Рекомендации по выбору клиентской реализации WebSocket, написанной на Java:
SSLSocketFactory
иSSLContext
должны иметь возможность использовать без лишних ограничений.Socket.connect(SocketAddress endpoint, int timeout)
nv-websocket-client охватывает все вышеперечисленное, кроме двух последних. Кроме того, одна из его небольших, но удобных функций - периодически отправлять фреймы пинг / понг. Этого можно добиться, просто вызвав
setPingInterval
/setPongInterval
методы (см. JavaDoc ).Отказ от ответственности: Такахико Кавасаки является автором nv-websocket-client.
источник
onDisconnected
метод иonError
метод WebSocketListener .onError
метод дает вамWebSocketException
экземпляр. Вызовите егоgetError()
метод, чтобы узнать, в чем проблема.Некоторые другие соображения:
Tyrus работает на Android. Однако библиотеки SSL, которые он использует в Android 5.0, содержат ошибки и не поддерживают квитирование SSL . Предполагается, что это будет исправлено в более новых версиях Android, но, поскольку Android не обновляется на многих устройствах, это может быть проблемой для вас.
В зависимости от того, как SSL реализован для других реализаций веб-сокетов, это также может быть проблемой.
AndroidAsync не имеет этой проблемы с SSL. У него есть и другие проблемы, такие как невозможность установить тайм-ауты .
источник
а) Добавьте этот файл в файл Gradle
compile 'com.github.nkzawa:socket.io-client:0.3.0'
б) Добавьте эти строки в Application Activity:
c) Добавьте эту функцию в свою деятельность, где вы вызвали WebSocket:
источник