package dk.thoerup.websocket; import java.io.IOException; import java.util.HashMap; import java.util.Random; import javax.websocket.CloseReason; import javax.websocket.EndpointConfig; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/wstest") public class AnnotatedSocket { static private HashMap sessions = new HashMap(); static private HashMap sessionNicks = new HashMap(); private static Random rand = new Random(); @OnOpen public void open(Session session, EndpointConfig conf) { String guestNick = "Guest-" + rand.nextInt(); broadcastMessage( "*** " + guestNick + " has joined the chat"); try { session.getBasicRemote().sendText( "Welcome " + guestNick); StringBuilder sb = new StringBuilder(); for(String n : sessionNicks.values() ) { sb.append(n).append(" "); } session.getBasicRemote().sendText( "*** On-line guests: " + sb.toString() ); } catch (IOException e) { System.out.println("Error sending welcome messages " + e.getMessage() ); } sessionNicks.put(session.getId(), guestNick); sessions.put(session.getId(), session); } @OnError public void error(Session session, Throwable error) { } @OnClose public void close(Session session, CloseReason reason) { String nick = sessionNicks.get( session.getId() ); sessions.remove(session.getId()); sessionNicks.remove(session.getId()); broadcastMessage( "*** " + nick + " has left the chat"); } @OnMessage public void onMessage(Session session, String msg) { String parts[] = msg.split("#", 2); String cmd = parts[0]; switch (cmd) { case "CHAT": String messagePart = parts[1]; String nick = sessionNicks.get(session.getId() ); broadcastMessage(nick + "> " + messagePart); break; case "NICK": String oldNick = sessionNicks.get( session.getId() ); String newNick = parts[1]; sessionNicks.put(session.getId(), newNick); broadcastMessage( "*** " + oldNick + " switched nick to " + newNick); break; } } private void broadcastMessage(String msg) { try { for(Session ses: sessions.values() ) { ses.getBasicRemote().sendText( msg); } } catch (IOException e) { System.out.println("Error broadcasting message " + e.getMessage() ); } } }