追加したいサービスバックグラウンドで実行されているAndroidアプリにウェブソケット接続(数時間または数日かかる場合もあります)を継続し、定期的にデータをサーバーに送信します。
現在、Java 用の WebSocket ライブラリが多数あるようですが、どれを使用すればよいかわかりません。
TooTallNate/Java-WebSocketGitHub からの説明: 100% Java で記述された、必要最低限の WebSocket クライアントおよびサーバー実装。http://java-websocket.org/-- これはリンクされています「android websocket」をグーグルで検索した最初の結果ただし、特に SSL 接続に関して未解決の問題がかなりあり、現時点では積極的にメンテナンスされていないようです。
koush/AndroidAsyncGitHub からの説明: Android 用の非同期ソケット、http (クライアント + サーバー)、Websocket、および socket.io ライブラリ。スレッドではなく nio に基づいています。-- やはり多くの未解決の問題がありますが、積極的に保守/作業されているようです。
プロジェクト・タイラスウェブサイトからの説明: JSR 356: WebSocket 用 Java API - リファレンス実装 - これは Oracle によって作成されました。Android で動作するかどうかはわかりません。
Jetty WebSocket クライアント APIウェブサイトからの情報: Jetty は、WebSocket サーバーとの通信を容易にするための Jetty WebSocket クライアント ライブラリも提供しています。 -- 繰り返しますが、Android で動作するかどうかはわかりません。
codebutler/android-websocketsGitHubからの説明: Android用の最低限のWebSocket(hybi13/RFC)クライアント - これは、schwiz/android-websocket-exampleこれは、StackOverflowの質問に対する受け入れられた回答です。Android デバイスでウェイクロックなしでインターネットへの TCP 接続を保持するにはどうすればよいですか?「」。
雰囲気/wasyncGitHub からの説明: Node.js、Android、Java 用のフォールバック トランスポートを備えた WebSocket クライアント ライブラリhttp://async.io.org/ より
川崎 貴彦 / nv-websocket-clientGitHub からの説明: Java での高品質な WebSocket クライアント実装。
スクエア/okhttpGitHub からの説明: Android および Java アプリケーション用の HTTP+SPDY クライアント。http://square.github.io/okhttp/--
それは Websocketモジュール 。としてscorpiodawg によって言及されましたOkHttp にはバージョン 3.5 以降、Websocket サポートが組み込まれています。ファイアベース/チューブソックGitHub からの説明: Java で実装された WebSocket クライアント ライブラリ
アウトバーン|Android(GitHub)ウェブサイトからの説明: Autobahn|Android は、Autobahn プロジェクトによって作成された Java/Android 用のオープンソース ネットワーク ライブラリであり、ネイティブ モバイル WebSocket/WAMP クライアントを作成するための WebSocket プロトコルと Web アプリケーション メッセージング プロトコル (WAMP) を実装します。--cloudsurfinが指摘したこれは WSS をサポートしていません。
さらに、ネイティブのソケット.ioAndroid 用クライアント ライブラリ:
- nkzawa/socket.io-client.javaGitHub からの説明: Socket.IO v1.0 以降と互換性のある、Java 用のフル機能の Socket.IO クライアント ライブラリ。
いずれにせよ、Web フロントエンドには nodejs/socket.io を使用する予定なので、socket.io Android クライアントを使用すると便利です。ただし、ネイティブ クライアントはまだ新しいため、未解決の問題がいくつかあります。さらに、WebSocket サポートはクライアント側で保証できるため、Android アプリでは socket.io クライアント ライブラリを使用するメリットはない (socket.io 1.0 サーバーとの互換性は別) と理解しています。
私の要件は次のとおりです。
- Android API 9以降との互換性
- SSL経由で接続可能
- 永久的なウェイクロックを保持することなく、長時間接続を維持する
- 利用可能なNode.js WebSocketサーバー実装またはsocket.ioとの互換性
これらの要件に適したライブラリはどれでしょうか?
ベストアンサー1
いくつかのメモ。
プロジェクト・タイラスAndroidでも動作しますが、ライセンスを確認してください(CDDL 1.1 および GPL 2 (CPE 付き))とその大きさ(ProGuard で WebSocket クライアント jar のサイズを削減する) が要件を満たしているかどうかを確認してください。また、テキストサイズが大きい場合、Tyrus は例外をスローする可能性があることに注意してください (おそらくバグです)。これ詳細については。
桟橋: 2年前メールスレッドjetty-usersメーリングリストでは「現在、Android 互換の Jetty 9 WebSocket クライアントはありません。Android での使用のために Jetty WebSocket クライアントを JDK 7 から JDK 5/6 にバックポートする計画はありますが、JSR-356 Java WebSocket API (javax.websocket) の実装を完了することよりも優先度は低くなります。」ジェティの現在の書類WebSocket クライアント API については Android については何も言及されていません。
codebutler/android-websocket実行しない握手を閉じるこれはRFC 6455閉じるときに例外がスローされる可能性があります。これ。
雰囲気/wasync用途非同期Httpクライアント/非同期 HTTP クライアントWebSocket 実装として。したがって、代わりに AsyncHttpClient/async-http-client について言及する必要があります。
ファイアベース/チューブソック検証しません
Sec-WebSocket-Accept
。これは違反ですRFC 6455また、TubeSock にはテキストメッセージの作成時にバグがあります。テキストメッセージにマルチバイト UTF-8 文字を使用すると、遅かれ早かれこのバグに遭遇することになります。第3号でdelight-im/Android-DDPTubeSock の問題に関する長いリスト。
検討ポイント
Java で記述された WebSocket クライアント実装を選択する際の考慮事項:
- コンプライアンス実装されていないものも少なくありません。握手を閉じるによって要求されるRFC 6455(クロージングハンドシェイクが実装されていない場合はどうなるでしょうか?これ。
- 必要なJavaバージョンJava SE 5、6、7、8、それとも Java EE? Android でも動作しますか?
- サイズ一部の実装には多くの依存関係があります。
- wssサポート。
- HTTP プロキシサポート。
- HTTPプロキシ経由のwssサポート。図2を参照HTML5 Web ソケットがプロキシ サーバーとやり取りする方法WebSocket クライアント ライブラリが HTTP プロキシ経由で wss をサポートするために何を行う必要があるかについて。
- SSL構成の柔軟性不必要な制限なく利用できる必要があり
SSLSocketFactory
ます。SSLContext
- カスタムHTTPヘッダーオープニングの握手基本認証を含む。
- HTTP プロキシネゴシエーションにおけるカスタム HTTP ヘッダープロキシ サーバーでの認証も含まれます。
- すべてのフレームタイプを送信可能(継続、バイナリ、テキスト、クローズ、ピンポン)かどうか。ほとんどの実装では、開発者に断片化されたフレームそして迷惑な ポンフレーム手動で。
- リスナーインターフェースさまざまな WebSocket イベントを受信できます。貧弱なインターフェースでは開発者のストレスがたまります。豊富なインターフェースがあれば、開発者は堅牢なアプリケーションを作成できます。
- WebSocketの状態を問い合わせ可能か否か。RFC 6455CONNECTING、OPEN、CLOSING、CLOSED 状態が定義されていますが、定義された方法で内部状態遷移を維持する実装はほとんどありません。
- ソケット接続のタイムアウト値を設定可能(メソッドの2番目の引数に相当)
Socket.connect(SocketAddress endpoint, int timeout)
- 基盤となるrawソケットにアクセスできる。
- 直感的に使いやすいAPIか否か。
- 十分に文書化されているか否か。
- RFC 7692(WebSocket の圧縮拡張機能)サポート (別名 permessage-deflate)。
- リダイレクション(3xx)サポート。
- ダイジェスト認証サポート。
nv-websocketクライアント最後の2つを除いて、上記のすべてをカバーしています。さらに、小さいながらも便利な機能の1つは、ping/pongフレームを定期的に送信することです。これは、setPingInterval
/setPongInterval
メソッドを呼び出すだけで実現できます(Javaドキュメント)。
免責事項: Takahiko Kawasaki は nv-websocket-client の作者です。