node.jsとwebsocket 頑張る第2段 androidアプリ側編
まず http://code.google.com/p/weberknecht/ からライブラリごっそりもってくる。
んで中にあるdeフォルダごとsrc下に置く。
通信用のクラスを作る。
WebSocketManager.java
package com.example.game; 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(message); } catch (WebSocketException wse) { wse.printStackTrace(); } } public static void close() { try { Log.d("DEBUG", "websocket connect close"); websocket.close(); } catch (WebSocketException wse) { wse.printStackTrace(); } } }
メインアクティビティで直接通信しようとするとエラーになるのでasynctask継承したクラスつくって非同期にする。
AsyncSocketRequest.java
package com.example.game; import java.util.HashMap; import de.roderick.weberknecht.WebSocketEventHandler; import de.roderick.weberknecht.WebSocketMessage; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.net.Uri.Builder; import android.os.AsyncTask; import android.util.Log; public class AsyncSocketRequest extends AsyncTask<Uri.Builder, Void, String> { private Activity mainActivity; public AsyncSocketRequest(Activity activity) { mainActivity = activity; // 呼び出し元のアクティビティ } @Override protected String doInBackground(Builder... params) { WebSocketManager.connect("ws://xxx.xxx.x.xx:xxxx/", new WebSocketEventHandler() { //接続開始時の処理. public void onOpen() { Log.d("DEBUG", "websocket connect open"); } @Override public void onMessage(WebSocketMessage message) { // メッセージ受信時の処理 Log.d("DEBUG", "message:" + message.getText()); } //接続終了時の処理. public void onClose() { Log.d("DEBUG", "websocket connect close"); } }); //送信. WebSocketManager.send("check"); return null; } }
で、メインからはこんな感じで使う。
Uri.Builder builder = new Uri.Builder(); AsyncSocketRequest task = new AsyncSocketRequest(this); task.execute(builder);