こちらでは、さらにすすめて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();
}
}
}
}
最終更新:2011年02月13日 21:47