Androidアプリで使用するWebSocketライブラリはどれですか?[閉まっている]


131

WebSocket接続を保持しているバックグラウンドで(おそらく数時間または数日にわたって)実行し、データを定期的にサーバーに送信するサービスをAndroidアプリに追加したいと思います。

今、Java用のWebSocketライブラリがたくさんあるようですが、どれを使うべきかわかりません:

さらに、Android用のネイティブのsocket.ioクライアントライブラリがあります。

  • nkzawa / socket.io-client.java GitHubからの説明:Java用のフル機能のSocket.IOクライアントライブラリ。Socket.IOv1.0以降と互換性があります。

とにかくwebフロントエンドにnodejs / socket.ioを使用する予定なので、socket.io Androidクライアントを使用すると便利です。しかし、ネイティブクライアントは非常に若く、いくつかの未解決の問題があります。そしてそれに加えて、WebSocketのサポートはクライアント側で保証できるため、Androidアプリには(socket.io 1.0サーバーとの互換性があることを除いて)socket.ioクライアントライブラリを使用するメリットがないことを理解しています。 。

私の要件は次のとおりです。

  • Android API 9以降との互換性
  • SSL経由で接続する可能性
  • 永続的なwakelockを保持する必要なく、接続を長期間維持します
  • 利用可能なnodejs websocketサーバー実装またはsocket.ioとの互換性

これらの要件に適したライブラリはどれですか?


おそらく雰囲気です。この質問を参照してください。
バジルブルク2015年

2
私はWebSocketやAtmosphereの専門家ではありません。Atmosphereが使い古されており、WebSocketサポートを含むプッシュ機能の多くのプロジェクトで使用されていることだけを知っています。私の唯一の経験は、Vaadin Webアプリの構築における間接的なものです。Vaadinは、自動プッシュ機能にAtmosphereを使用しています。ただし、WebSocketは比較的新しいものであり、その歴史、歴史の中で定義、仕様、およびさまざまな実装に多くの変更が加えられています。したがって、どのように行っても「問題」を予期してください。
バジルブルク

2
参考までに、アウトバーンはそこにあり、彼らは派手なウェブサイトを持っています。しかし、「セキュアなWebSocketは実装されていません」ということに気付かずに、インストールして実行しようとするまで時間がかかります。次。
cloudsurfin 2016

1
私はコメントするのに十分な評判がないので、質問で述べたのと同じ要件を通過し、okhttpがすべての要件を満たすのを助けてくれたので、回答として書いています。バージョン3.5の導入以来、Webソケットをサポートしているため、okHttp(Webサービス呼び出し+ Webソケットサポート)を使用することの追加の利点があります。こちらが最初のリンクです。< medium.com/@ssaurel/… >
Kaleem Patel

7
このような質問はクローズしないでください。
Martin Berger、

回答:


123

いくつかのメモ。

  • koush / AndroidAsyncは、RFC 6455で要求されいる終了ハンドシェイクを実行しません。詳細はこちらをご覧ください。

  • Project TyrusはAndroidで動作しますが、ライセンス(CDDL 1.1およびGPL 2 with CPE)とサイズ(ReGuardでのWebSocketクライアントjarサイズの縮小)が要件を満たしていることを確認してください。また、テキストのサイズが大きい場合、Tyrusが例外をスローする可能性があることにも注意してください(おそらくバグです)。詳細はこちらをご覧ください。

  • Jetty:jetty-usersメーリングリストの2年前のメールスレッドには、「現在Android互換のJetty 9 WebSocketクライアントはありません。JettyWebSocketクライアントをJDK 7からJDK 5/6にandroidにバックポートしようとする計画があります。使用しますが、JSR-356 Java WebSocket API(javax.websocket)の実装を完了するよりも優先度が低くなります。」WebSocketクライアントAPIに関するJettyの現在のドキュメントでは、Androidについては何も触れられていません。

  • codebutler / android-websocketは、RFC 6455で必要な終了ハンドシェイクを実行せず、終了時に例外をスローする場合があります。参照してくださいこれを

  • Atmosphere / wasyncは、WebSocket実装としてAsyncHttpClient / async-http-clientを使用します。したがって、代わりに、AsyncHttpClient / async-http-clientを代わりに記述する必要があります。

  • firebase / TubeSockは検証しませんSec-WebSocket-Accept。これはRFC 6455に対する違反です。また、TubeSockにはテキストメッセージの作成にバグがあります。テキストメッセージにマルチバイトUTF-8文字を使用すると、遅かれ早かれバグが発生します。TubeSockの問題に関する長いリストについては、delight-im / Android-DDPの第3号を参照してください。

留意点

Javaで記述されたWebSocketクライアント実装を選択する際の考慮点:

  1. コンプライアンスRFC 6455で要求されるクロージングハンドシェイクを実装していない実装は少なくありません。(終了ハンドシェイクが実装されていない場合はどうなりますか?これを参照してください。)
  2. 必要なJavaバージョン。Java SE 5、6、7、8、またはJava EE?Androidでも動作しますか?
  3. サイズ。一部の実装には多くの依存関係があります。
  4. wssサポート。
  5. HTTPプロキシのサポート。
  6. wss over HTTPプロキシサポート。HTTPプロキシ経由でwssをサポートするためにWebSocketクライアントライブラリが何をする必要があるかについては、HTML5 Webソケットとプロキシサーバーの相互作用の図2を参照してください。
  7. SSL構成の柔軟性SSLSocketFactoryそしてSSLContext、不必要な制限なく利用することができなければなりません。
  8. 基本認証を含む開始ハンドシェイクのカスタムHTTPヘッダー
  9. プロキシサーバーでの認証を含む、HTTPプロキシネゴシエーションのカスタムHTTPヘッダー
  10. すべてのフレームタイプ(継続、バイナリ、テキスト、クローズ、ピン、ポン)を送信できるかどうか。ほとんどの実装では、断片化されたフレーム未承諾の ポンフレームを手動で送信する手段を開発者に提供していません。
  11. さまざまなWebSocketイベントを受信するためのリスナーインターフェイス。貧弱なインターフェースは開発者を苛立たせます。豊富なインターフェースにより、開発者は堅牢なアプリケーションを作成できます。
  12. WebSocketの状態を問い合わせることができるかどうか。RFC 6455はCONNECTING、OPEN、CLOSINGおよびCLOSED状態を定義していますが、内部状態遷移を定義された方法で維持する実装はほとんどありません。
  13. ソケット接続のタイムアウト値を設定できます。(メソッドの2番目の引数に相当)Socket.connect(SocketAddress endpoint, int timeout)
  14. 基になるrawソケットにアクセスできます
  15. 直感的で使いやすいAPIかどうか。
  16. 十分に文書化されているかどうか。
  17. RFC 7692(WebSocketの圧縮拡張)サポート(別名permessage-deflate)。
  18. リダイレクト(3xx)のサポート。
  19. ダイジェスト認証のサポート。

nv-websocket-clientは、最後の2つを除く上記すべてをカバーします。さらに、その小さいながらも便利な機能の1つは、ping / pongフレームを定期的に送信することです。setPingInterval/setPongIntervalメソッドを呼び出すだけで実現できます( JavaDocを参照)。

免責事項:川崎貴彦はnv-websocket-clientの作者です。


1
nv-websocket-clientライブラリはまだ開発中ですか?エラー1006で理由もなく、TooTallNate / Java-WebSocketsで自動切断の問題に直面しました。このnv-websocketでも解決できますか?
Ankit Bansal

1
1006に関しては、仕様(RFC 6455)は、コードがエンドポイントによってCloseコントロールフレームのステータスコードとして設定されてはならないことを述べています。これは、コードがクライアント側で生成されたことを意味します。WebSocketListenerのonDisconnectedメソッドとonErrorメソッドを使用して、切断に関する詳細情報を取得できます。メソッドはインスタンスを提供します。そのメソッドを呼び出して、何が問題なのかを確認します。onErrorWebSocketExceptiongetError()
川崎貴彦

7
wssの場合、私はokhttpとautobahnを試しました(この回答のセルフプロモーションの疑いもあります)。アウトバーンは簡単でしたが、SSLがありませんでした。OkHttpにはほとんど(ゼロ)の(統合された)ドキュメントがあります(2016年2月)。必要最低限​​の例を機能させるための回避策(タイムアウトを0に設定したり、受信メッセージを閉じたりするなど)に精通していなかったため、コードと例外を読むのに多くの時間を費やしました。これら2つ(そして私の欲求不満)を捨てると、私はnv(さわやかに)が十分に文書化されていることに気付きました。それは大騒ぎなしで働いた。
cloudsurfin 2016

1
Square / okhttpの新しいWebソケットのサポートについての考えは?medium.com/square-corner-blog/...
scorpiodawg

2
OkHttpの詳細はわかりません。Authlete、Inc.の創設者として忙しくて申し訳ありません(「APIセキュリティスタートアップAuthleteがシード資金として120万ドルを調達」)私はOkHttpを調べて考慮ポイントのリストを更新する時間を割くことができません。私の回答以降の変更については、CHANGES.mdを参照してください。nv-websocket-clientは私の趣味であり、OkHttpは138人の貢献者を抱える大きなプロジェクトのようです。
川崎貴彦

4

その他の考慮事項:

TyrusはAndroidで動作します。ただし、Android 5.0で使用するSSLライブラリはバグが多く、SSLハンドシェイクに失敗します。これは新しいバージョンのAndroidで修正される予定ですが、Androidが多くのデバイスで更新されないため、これが問題になる可能性があります。

他のWebSocket実装でのSSLの実装方法によっては、これも問題になる場合があります。

AndroidAsyncにはこのSSLの問題はありません。タイムアウトを設定できないなどの問題もあります


3

a)このファイルを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://プロトコルをサポートしていません。
ギリッシュブティヤ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.