red5のWebSocket用プラグインつくりました。3

1 > 2 > 3 > 動作例

では、解説を

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に送ることができるようになっています。

1 > 2 > 3 > 動作例

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月13日 21:48
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。