読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

AndroidでWebSocket通信する

Android


AndroidでWebSocket通信するサンプルです。


使用したライブラリは TooTallNate/Java-WebSocket · GitHub です。



weberknecht -


Java WebSocket Client Library - Google Project Hosting
のほうが人気があるらしいですけど、Java-WebSocketのほうがライセンス緩かったので…


WebSocketのサーバー側はテキトーに準備しておいてください。
自分は igrigorik/em-websocket · GitHub を使いました。




Android側は次のような感じになります。

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    private Handler mHandler;

    private WebSocketClient mClient;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mHandler = new Handler();

        if ("sdk".equals(Build.PRODUCT)) {
            // エミュレータの場合はIPv6を無効    ----1
            java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
            java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
        }

        try {

            URI uri = new URI("ws://10.0.2.2:3333");

            mClient = new WebSocketClient(uri) {
                @Override
                public void onOpen(ServerHandshake handshake) {
                    Log.d(TAG, "onOpen");
                }

                @Override
                public void onMessage(final String message) {
                    Log.d(TAG, "onMessage");
                    Log.d(TAG, "Message:" + message);
                    mHandler.post(new Runnable() {    // ----2
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onError(Exception ex) {
                    Log.d(TAG, "onError");
                    ex.printStackTrace();
                }

                @Override
                public void onClose(int code, String reason, boolean remote) {
                    Log.d(TAG, "onClose");
                }
            };
            
            mClient.connect();

        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        // 送信ボタン
        Button button = (Button) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText edit = (EditText) findViewById(R.id.edit);
                try {
                    // 送信
                    mClient.send(edit.getText().toString());
                } catch (NotYetConnectedException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

    }
}

マニフェストには

<uses-permission android:name="android.permission.INTERNET" />

を忘れないように




ある程度パッと見で分かると思いますが、少しだけ注意事項。


1. エミュレータで動かす場合の対処法です。そのまま動かすと

java.net.SocketException: Bad address family

って出てうまくいかないので、この処理を入れておいたほうが良いでしょう。


2. WebSocket通信は別スレッドで動いていますので、受信メッセージからUI側を更新する場合は必ずHandler等を使って更新するようにしましょう。UIスレッドで更新しないと怒られちゃいますので。


このサンプルではエラーチェック等は省いてるので適宜入れてください。



サンプルのソースは
STAR-ZERO/SampleWebSocket-android · GitHub
にあげておきます。



Androidmakebooth のストリームを取得するやつも参考にどうぞ。
かなりいい加減に書いてますが…
STAR-ZERO/MakeBoothStream-android · GitHub



次は Pusher | HTML5 WebSocket Powered Realtime Messaging Service を時間あるときに使ってみたいと思います。