Hatena::ブログ(Diary)

Nubilumの日記 このページをアンテナに追加 RSSフィード Twitter

2011-05-25

Androidからnode.jsとWebSocket通信をする実装

表題の通り。

この一週間くらい、ずっと個人的に検証してたのですが、ようやく通信ができました。

まあ前置きはいいのでとりあえず下準備をば。


(1) npmでwebsocket-serverモジュールを追加する

 node.jsサーバーにしてWebSocket通信をするならこれで。npm自体のインストール3つくらい前の日記を参照のこと。

npm install websocket-server


(2) Androidプロジェクトのビルドパスにweberknecht-0.1.jarを追加

 これも前の記事にてリンクあり。JavaのWebSocketクライアントです。


(3) 実装! 実装! 実装!

server.js

var sys = require('sys');
var ws  = require('websocket-server'); //必要なモジュールのインポート.

var sockets = []; //ソケットを詰め込む配列. なくても可.

var server = ws.createServer(); //サーバーオブジェクト作成.

//ソケットの接続開始した時のリスナーをadd.
server.addListener("connection", function(connection) {

    sockets.push(connection);
    sys.puts("connect"); //node.js側でechoする.
    
    //ソケットからメッセージが飛んできた時のリスナーをadd.
    connection.addListener("message", function(message){
        sys.puts(message);
        //まあとりあえずメッセージを全ソケットに返しとく.
        for (var k in sockets) { 
	    sockets[k].send(message);
	}
    });
    
});
//接続が切断された際のリスナーをadd.
server.addListener("close", function(connection) {
    sys.puts("close");
});
//listenするポート番号を指定.
server.listen(8000);


WebSocketManager.java

package jp.akira.kumoi.sockets;

import java.net.URI;
import java.net.URISyntaxException;

import android.util.Log;
import de.roderick.weberknecht.WebSocket;
import de.roderick.weberknecht.WebSocketConnection;
import de.roderick.weberknecht.WebSocketEventHandler;
import de.roderick.weberknecht.WebSocketException;

public class WebSocketManager {
	
	
	private static WebSocket websocket;
	
	public static void connect(String url, WebSocketEventHandler handler) {
		
		try {
			URI uri   = new URI(url);
			websocket = new WebSocketConnection(uri);

			Log.d("DEBUG", "websocket connect start");
			websocket.setEventHandler(handler);
			websocket.connect();

		} catch (WebSocketException wse) {
			wse.printStackTrace();
		} catch (URISyntaxException use) {
			use.printStackTrace();
		}
	}
	
	public static void send(String message) {
		try {
			Log.d("DEBUG", "websocket connect send");
			websocket.send("check");
		} catch (WebSocketException wse) {
			wse.printStackTrace();
		}
	}
	
	public static void close() {
		try {
			Log.d("DEBUG", "websocket connect close");
			websocket.close();
		} catch (WebSocketException wse) {
			wse.printStackTrace();
		}
	}

}


使い方

//IPとポート指定して接続. プロトコルはws(WebSocket).
WebSocketManager.connect("ws://xxx.xxx.xxx.xxx:8000/", new WebSocketEventHandler() {
	//接続開始時の処理.
	public void onOpen() {
		Log.d("DEBUG", "websocket connect open");
	}

	//メッセージ受信時の処理.
	public void onMessage(WebSocketMessage message) {
		String str = message.getText();
		Log.d("DEBUG", "websocket message on " + str);

                Intent intent = new Intent(getApplicationContext(), (Class)移動させたいActivity.class);
                startActivity(intent);
                finish();
	}

	//接続終了時の処理.
	public void onClose() {
		Log.d("DEBUG", "websocket connect close");
	}
});
		
//送信.
WebSocketManager.send("check");


だいたいこんな感じ。

サーバー側の処理はアシアルさんの記事クライアント側のほうはweberknechtのサンプルを参考にしました。


一応Xperia arcにて動作確認しました。

NFCとか出てもなかなか対応端末がなかったりで、リアルタイム対戦ゲームとか考え中の人は候補のひとつとしてWebSocketもいいんじゃなかでしょうか。


間違いとか「こうしたほうがいんじゃね?」とかありましたら、ご指摘お願いします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Nubilum/20110525/1306341271