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

1 > 2 > 3 > 動作例

こちらでは、さらにすすめてWebSocketクライアントからの接続検出、データの受け取り、データの送信、切断の検出をやってみたいと思います。

まずはソースコード(ただし抜粋)
/**
 * Red5アプリケーションエントリ
 * @author taktod
 */
public class Application extends ApplicationAdapter {
	Map<String, WebSocketListener> scopeListeners = new HashMap<String, WebSocketListener>();
	@Override
	public boolean appConnect(IConnection conn, Object[] objects) {
		// scopeと連携させるべき。
		WebSocketListener listener = scopeListeners.get(conn.getScope().getPath());
		kickAllWebSocketConnection(listener, "あたらしいユーザーがログインしたようです。");
		return super.appConnect(conn, objects);
	}
	@Override
	public boolean roomStart(IScope scope) {
		WebSocketListener listener = scopeListeners.get(scope.getPath());
		if(listener == null) {
			listener = new WebSocketListener(scope);
			scopeListeners.put(scope.getPath(), listener);
		}
		WebSocketScopeManager manager = new WebSocketScopeManager();
		manager.addListener(listener);
		kickAllWebSocketConnection(listener, "start Room");
		kickAllWebSocketConnection(listener, "ルーム始まり・・・");
		boolean result = super.roomStart(scope);
		return result;
	}
	@Override
	public void roomStop(IScope scope) {
		super.roomStop(scope);
		WebSocketListener listener = scopeListeners.get(scope.getPath());
		if(listener != null) {
			scopeListeners.remove(scope.getPath());
			kickAllWebSocketConnection(listener, "room is closed.");
			WebSocketScopeManager manager = new WebSocketScopeManager();
			manager.removeListener(listener);
		}
		scope.removeAttribute("WSListener");
	}
	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();
			}
		}
	}
	@SuppressWarnings("unused")
	private void kickAllWebSocketConnection(WebSocketListener listener, byte[] bytes) {
		IoBuffer buffer = IoBuffer.allocate(bytes.length + 2);
		buffer.put((byte)0x00);
		buffer.put(bytes);
		buffer.put((byte)0xFF);
		buffer.flip();
		WebSocketScopeManager manager = new WebSocketScopeManager();
		WebSocketScope scope = manager.getScope(listener.getPath());
		Iterator<WebSocketConnection> iter = scope.getConns().iterator();
		while(iter.hasNext()) {
			WebSocketConnection conn;
			conn = iter.next();
			conn.send(buffer);
		}
	}
	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();
			}
		}
	}
}
 


1 > 2 > 3 > 動作例

タグ:

+ タグ編集
  • タグ:

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

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

下から選んでください:

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