2011-05-25
Androidからnode.jsとWebSocket通信をする実装
Java, Android, WebSocket, node.js
表題の通り。
この一週間くらい、ずっと個人的に検証してたのですが、ようやく通信ができました。
まあ前置きはいいのでとりあえず下準備をば。
(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
リンク元
- 11 http://www.google.co.jp/search?hl=ja&q=java+android+websocket&aq=f&aqi=&aql=&oq=
- 6 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=websocket+クライアント+node.js
- 4 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=android+websocket&qscrl=1
- 4 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/Nubilum/20110525/1306341271&rct=j&q=android web socket&ei=dm_kTdzqGILYuAPKyMiKBw&usg=AFQjCNHw_CUY2fFSOtbSDDSig1GfG0cT-w
- 4 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCIQFjAB&url=http://d.hatena.ne.jp/Nubilum/20110525/1306341271&rct=j&q=Android websocket&ei=NuzdTevDMYzqvQOphKC7BQ&usg=AFQjCNHw_CUY2fFSOtbSDDSig1GfG0cT-w&sig2=-YCgfDZYlvWKCftybrvrHA
- 3 http://bit.ly/iI0Nry
- 3 http://d.hatena.ne.jp/tagomoris/20110608/1307502071
- 3 http://node-js.info/?p=550
- 3 http://search.minakoe.jp/rsss/rsss.asp?pgsz=100&qry=java¬wit=1&twit=0&debug=1&multi=1
- 3 http://www.google.co.jp/url?sa=t&source=web&cd=3&ved=0CCsQFjAC&url=http://d.hatena.ne.jp/Nubilum/20110525/1306341271&rct=j&q=websocket android 3&ei=U1fdTZDVBYLOvQP-sLyjDw&usg=AFQjCNHw_CUY2fFSOtbSDDSig1GfG0cT-w&sig2=dBfxeAeqAIJf7DYqcxei7w