Androidはsocketを使うioインスタント通信の実現


概要
WebSocketは、ブラウザとサーバ間の双方向通信を実現するHTML 5の新しい通信プロトコルです.そしてSocket.IOはJavaScriptによって完全に実現され、Nodeに基づいている.js、WebSocketをサポートするプロトコルは、リアルタイム通信、プラットフォーム間のオープンソースフレームワークに使用されます.
本文はsocket.に基づいてio公式提供socket.io-android-chat Demoがsocketを説明するioはandroidクライアントでインスタント通信のいくつかの基本的な操作を実現する.
githubリンクを添付します.
  • Javaサポートライブラリsocket.io-client-java
  • AndroidチャットDemo socket.io-android-chat

  • Demoは以下の機能を実現しました.
  • 基本文字チャット機能
  • 各ユーザが加入または離脱するときに通知
  • が送信される.
  • ユーザが情報の入力を開始すると入力状態の通知
  • が送信.
    依存の追加
    まず、buildに依存を追加します.gradle、次のようにします.
    compile ('io.socket:socket.io-client:0.8.3') {
      // excluding org.json which is provided by Android
      exclude group: 'org.json', module: 'json'
    }

    2つ目はAndroidManifestですxmlにネットワーク権限を登録する
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.INTERNET" />
        ...
    manifest>

    プロジェクトでsocket.を使用できるようになりましたIO了~
    Socketの初期化
    私たちはIOを通過することができます.SOcket(URL)メソッドは、サーバアドレスであるSocketインスタンスを取得します.
    Socket mSocket = IO.socket("http://chat.socket.io");

    Socketインスタンスを取得したらconnect()メソッドを呼び出してサーバに接続します.
    mSocket.connect();

    完全な初期化コードは次のとおりです.
    import com.github.nkzawa.socketio.client.IO;
    import com.github.nkzawa.socketio.client.Socket;
    
    private Socket mSocket;
    {
        try {
            //1.   socket.io,    
            mSocket = IO.socket("http://chat.socket.io");
        } catch (URISyntaxException e) {}
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //2.  socket.io      
        mSocket.connect();
    }

    データの転送
    私たちはmSocket.を通じてEmit(「KEY」,「VALUE」)のメソッドはサーバにメッセージを送信し、「KEY」はイベントのキーであり、「VALUE」はイベントの値であり、値は任意のタイプのデータをサポートする.
    サーバに対して「new message」イベントを送信し、その値は「hi~」:
    mSocket.emit("new message", "hi~");
    private EditText mInputMessageView;
    
    //       
    private void attemptSend() {
        String message = mInputMessageView.getText().toString().trim();
        if (TextUtils.isEmpty(message)) {
            return;
        }
    
        mInputMessageView.setText("");
        mSocket.emit("new message", message);
    }

    イベントのリスニング
    Socket.IOは双方向に情報を伝達するものであり,これはサーバにいつでもイベントを送信したり,サーバから返されたイベントにいつでも応答したりできることを意味する.
    私たちはmSocket.を通じてon(「KEY」,LISTENER)メソッドは,サーバが返すイベントをリスニングする.ここで「KEY」はイベントのキー、LISTENERはListener、ListenerのタイプはEmitter.Listener() .
    mSocket.on("new message", onNewMessage);

    new messageイベントをリスニングする例を次に示します.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //   onNewMessage           "new message"   
        mSocket.on("new message", onNewMessage);
        mSocket.connect();
    }
    
    private Emitter.Listener onNewMessage = new Emitter.Listener() {
        @Override
        public void call(final Object.. args) {
            //     
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    JSONObject data = (JSONObject) args[0];
                    String username;
                    String message;
                    try {
                        username = data.getString("username");
                        message = data.getString("message");
                    } catch (JSONException e) {
                        return;
                    }
    
                    // add the message to view
                    addMessage(username, message);
                }
            });
        }
    };

    Emitter.Listener()インタフェースはcallメソッドでサーバから送信されたデータを返します.callメソッドはサブスレッドで実行され、callメソッドでUIを更新する必要がある場合はhandlerまたはrunOnUI Threadを使用してメインスレッドに操作を配置して実行する必要があります.
    リソースの解放
    メモリの漏洩などの問題を避けるため.SOcketの使用が完了したら、socketとサーバの接続を解除し、socketのリスニングイベントを解放する必要があります.
    サーバ接続の切断(disconnect):
    mSocket.disconnect();

    offメソッドを呼び出してリスニングイベントを解放するには、次の手順に従います.
    mSocket.off("new message", onNewMessage);

    Activityの終了時にsocketを解放します.
    @Override
    public void onDestroy() {
        super.onDestroy();
    
        mSocket.disconnect();
        mSocket.off("new message", onNewMessage);
    }