2013年3月17日日曜日

WebSocket for Android (PhoneGap Plugin)


とある理由によりPhoneGapでWebSocketが使えるプラグインを作りました。こちらに置いてあります。ただしAndroid専用です。
iOS用も探せばあると思いますが、こちらのサイトによるとiOS Safariでは4.2からWebSocketをサポートしているので、そちらで十分なんじゃないでしょうか。

作った理由のひとつは上記サイトにあるとおりなんですが、Android BrowserがなぜかWebSocketに未対応なんですよね。
んで、WebSocketを使うAndroid専用アプリを作る場合、JavaでWebSocketをやる方法は検索すると割と豊富に出てくるわけですが、今一度、PhoneGapでAndroidアプリを作ってみたかったんです!ただそんだけ!(本当に単純な理由だな...)
そしてPhoneGapでWebSocketを使ったアプリ作るなら、そのプラグインも作ってみようかと思ったわけです。

プラグインの中身ですが、W3CのWebSocketの使用感に極力合わせることを目標にしました。
サンプルコードはこんな感じです。

// WebSocketのインスタンスを生成
var ws = new plugins.WebSocket('ws://echo.websocket.org:80');

// ソケットオープンしたときの処理
ws.onopen = function () {
    console.log('onopen');
    // メッセージの送信
    this.send('hello');
};

// メッセージ受信したときの処理
ws.onmessage = function (data) {
    console.log(data);  // hello
    // 受信したらクローズ
    this.close();
};

// エラーが発生したときの処理
ws.onerror = function (message) {
    // エラー理由をコンソールに出力
    console.log(message);
};

// ソケットクローズしたときの処理
ws.onclose = function (code) {
    // 終了コードをコンソールに出力
    console.log(code);  // 1000
};

WebSocket.orgのサイトでechoサーバが公開されているので、そちらに繋いで「hello」とメッセージを送り、サーバからエコーされてきたメッセージ(helloのはず)をコンソールに出力して終わりです。
なお、これをエミュレータで動かすとうまくいかないので、以下のような「おまじない」をActivityのonCreateに追加します。実機では必要ないです。

java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
java.lang.System.setProperty("java.net.preferIPv4Stack", "true");

2 件のコメント:

  1. Hi,
    does this plugin works with cordova 3.0.0???

    返信削除
  2. Hi,
    I have not check the compatibility of it yet. Unfortunately I am so busy now, I wll check it later.

    返信削除