package org.simpleframework.http.socket;
import java.io.File;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import org.simpleframework.http.Cookie;
import org.simpleframework.http.Request;
import org.simpleframework.http.socket.WebSocketCertificate.KeyStoreReader;
import org.simpleframework.http.socket.service.Service;
import org.simpleframework.transport.trace.TraceAnalyzer;
public class WebSocketChatRoom extends Thread implements Service {
private final WebSocketChatRoomListener listener;
private final Map<String, FrameChannel> sockets;
private final Set<String> users;
public WebSocketChatRoom() {
this.listener = new WebSocketChatRoomListener(this);
this.sockets = new ConcurrentHashMap<String, FrameChannel>();
this.users = new CopyOnWriteArraySet<String>();
}
public void connect(Session connection) {
FrameChannel socket = connection.getChannel();
Request req = connection.getRequest();
Cookie user = req.getCookie("user");
if(user == null) {
user = new Cookie("user", "anonymous");
}
String name = user.getValue();
try {
socket.register(listener);
join(name, socket);
} catch(Exception e) {
e.printStackTrace();
}
}
public void join(String user, FrameChannel operation) {
sockets.put(user, operation);
users.add(user);
}
public void leave(String user, FrameChannel operation){
sockets.put(user, operation);
users.add(user);
}
public void distribute(Frame frame) {
try {
for(String user : users) {
FrameChannel operation = sockets.get(user);
try {
operation.send(frame);
} catch(Exception e){
sockets.remove(user);
users.remove(user);
e.printStackTrace();
operation.close();
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] list) throws Exception {
TraceAnalyzer agent = new WebSocketAnalyzer();
WebSocketChatRoom application = new WebSocketChatRoom();
File file = new File("C:\\work\\development\\async_http\\proxy\\yieldbroker-proxy-site\\certificate\\www.yieldbroker.com.pfx");
KeyStoreReader reader = new KeyStoreReader(WebSocketCertificate.KeyStoreType.PKCS12, file, "p", "p");
WebSocketCertificate certificate = new WebSocketCertificate(reader, WebSocketCertificate.SecureProtocol.TLS);
WebSocketChatApplication container = new WebSocketChatApplication(application, certificate, agent, 6060);
application.start();
container.connect();
}
}