import java.net.*; import java.io.*; import java.util.*; class ChatServer { protected Hashtable users = new Hashtable(); protected ServerSocket server; public static void main(String[] args) throws IOException { ChatServer cs = new ChatServer(8080); cs.accept(); } public ChatServer(int port) { // create a server listening at port, max 15 pending connections try { // ### create server socket attached to port server = ... ; } catch (IOException e) { System.err.println("cannot listen at "+port+ " ("+e.getMessage()+")"); } } public void accept() { System.out.println("ChatServer listening..."); Socket socket = null; while (true) { // For each connection, start a new client handler // in its own thread and keep on listening try { socket = server.accept(); // ### create ClientHandler attached to this, socket // ### create thread attach to handler // ### launch thread } catch (IOException e) { System.err.println("Error creating socket connection"); System.exit(1); } } } // S U P P O R T R O U T I N E S /** Track that this user name has this output stream */ public void registerClient(String user, PrintStream out) { broadcast(user, "connected"); users.put(user, out); } /** Send a string to everybody but user */ public void broadcast(String user, String line) { Enumeration e = users.keys(); while ( e.hasMoreElements() ) { String u = (String)e.nextElement(); if ( !u.equals(user) ) { PrintStream out = (PrintStream)users.get(u); out.println(user+": "+line); } } } public void disconnect(String user) { users.remove(user); broadcast(user, "disconnected"); } }