では、解説を
Map<String, WebSocketListener> scopeListeners = new HashMap<String, WebSocketListener>();
まずこの部分ですが、スコープごとに別のlistenerを持たせて個々の動作をさせます。本当はIScopeオブジェクトに属性を設置してやりとりしたかったのですが
persistentな属性がおかしな具合に追加されて、うまく動作しなかったのでMapをつくってそこに保持させました。(persistent周りはおそらくred5のバグです。)
要するにうまく動かなかったので、Mapにためておいたということです。
private class WebSocketListener extends WebSocketAbstructDataListener {
public WebSocketListener(IScope scope) {
super(scope);
}
@Override
public void getData(IoBuffer buf) {
}
@Override
public void getMessage(String message) {
System.out.println(path + " message -> " + message);
}
@Override
public void connect(WebSocketConnection conn) {
// TODO Auto-generated method stub
try {
System.out.println(path + " new client:" + conn.getId());
}
catch(WebSocketException e) {
e.printStackTrace();
}
}
@Override
public void leave(WebSocketConnection conn) {
// TODO Auto-generated method stub
try {
System.out.println(path + " disconnect client:" + conn.getId());
}
catch(WebSocketException e) {
e.printStackTrace();
}
}
}
このプライベートクラスはWebSocket用のlistenerクラスです。
ここに、それぞれのイベントが発行されたときの処理を書いておきます。
getData:WebSocketクライアントから送られたbyteデータ
getMessage:WebSocketクライアントから送られたbyteデータをString型に変更したデータ
connect:WebSocketクライアントがそのスコープにあたらしく接続したときのイベント
leave:WebSocketクライアントがそのスコープから切断したときのイベント
この4つを実装してあります。
private void kickAllWebSocketConnection(WebSocketListener listener, String message) {
WebSocketScopeManager manager = new WebSocketScopeManager();
WebSocketScope scope = manager.getScope(listener.getPath());
Iterator<WebSocketConnection> iter = scope.getConns().iterator();
while(iter.hasNext()) {
WebSocketConnection conn;
conn = iter.next();
try {
conn.send(message);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
この部分はソケット接続全員にメッセージを送り返す処理です。
RtmpのIConnectionにinvokeしてメッセージを送るのとにた感じになっています。
ちなみに使っていませんがbyteデータを送るための関数も準備してあります。
基本的にWebSocketConnectionを取得してそれに対してsendを実行すればメッセージがWebSocketクライアントに送られます。
WebSocketListener listener = scopeListeners.get(conn.getScope().getPath());
kickAllWebSocketConnection(listener, "あたらしいユーザーがログインしたようです。");
先ほどのkickAllWebSocket関数をつかって対象スコープのWebSocketクライアント全員に任意のメッセージを送信します。
この場合はFlashの接続があった場合に「あたらしいユーザーがログインしたようです。」とメッセージを返しています。
listenerを独自にカスタマイズすることで、各種イベント用の動作を定義する。
connection宛にsendを実行することで、任意のメッセージをWebSocketに送ることができるようになっています。
最終更新:2011年02月13日 21:48