web-dev-qa-db-ja.com

Androidアプリで使用するWebSocketライブラリはどれですか?

WebSocket 接続を保持しているバックグラウンドで実行されるAndroidアプリに Service を追加します(数時間または数日にわたって)。サーバーにデータを送信します。

現在、Java用のWebSocketライブラリがたくさんあるようです。どちらを使用すべきかわかりません。

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

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

Socket.io Androidクライアントを使用することは、とにかくWebフロントエンドにnodejs/socket.ioを使用する予定なので、便利です。しかし、ネイティブクライアントは非常に若く、いくつかの未解決の問題があります。それに加えて、Androidアプリにはsocket.ioクライアントライブラリを使用するメリットはありません(socket.io 1.0サーバーと互換性があることを除けば)。クライアント側で安心してください。

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

  • Android AP​​I 9以降との互換性
  • SSL経由で接続する可能性
  • 永続的なウェイクロックを保持することなく、長時間接続を維持する
  • 利用可能なnodejs websocketサーバー実装またはsocket.ioとの互換性

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

120
x-ray

その他の考慮事項:

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

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

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

4
mattm

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(() -> {


            });
        }
    };
3
Anil Singhania