import java.net.*; import java.io.*; import java.util.*; public class Server implements Runnable { private Thread thread = new Thread(this); private ServerSocket ss; private Vector clientVector = new Vector(); private int nClients = 0; private static int port = 2000; private static boolean visible = true; public static void main(String args[]) { if(args.length != 0) { port = Integer.parseInt(args[0]); } new Server(); } public Server() { try { ss = new ServerSocket(port); } catch (IOException e) { System.exit(1); } thread.start(); } public void run() { while(true) { Socket s = null; try { s = ss.accept(); } catch(IOException e) {} addClient(s); } } private synchronized void addClient(Socket s) { broadcast(s, "CLIENT CONNECTED: " + getHost(s)); clientVector.addElement(s); new ClientHandler(s, this); } public synchronized void removeClient(Socket s) { clientVector.removeElement(s); broadcast(s, "CLIENT DISSCONNECTED: " + getHost(s)); } public synchronized void broadcast(Socket sFrom, String message) { for(int i = 0; i < clientVector.size(); i++) { Socket s = (Socket)clientVector.elementAt(i); sendToOne(s, message); } } private synchronized void sendToOne(Socket s, String message) { try { PrintWriter out = new PrintWriter(s.getOutputStream(), true); out.println(message); } catch (IOException e) {} } public synchronized void who(Socket s) { for(int i = 0; i < clientVector.size(); i++) { Socket sTmp = (Socket)clientVector.elementAt(i); String hostTmp = getHost(sTmp); sendToOne(s, "WWHHOO: " + hostTmp); } } private String getHost(Socket socket) { return(socket.getInetAddress().getHostName()); } private String getHost(ServerSocket ss) { try { return(ss.getInetAddress().getLocalHost().getHostName()); } catch(UnknownHostException uhe) { return("FAILED: GET SERVER HOST"); } } } class ClientHandler extends Thread { private Server server; private Socket s; public ClientHandler(Socket s, Server server) { this.s = s; this.server = server; start(); } public void run() { BufferedReader in = null; try{ in = new BufferedReader(new InputStreamReader(s.getInputStream())); } catch(IOException e) { server.removeClient(s); return; } String inputLine; try { while ((inputLine = in.readLine()) != null) { if(inputLine.equals("wwhhoo")) server.who(s); else server.broadcast(s, inputLine); } in.close(); s.close(); } catch (IOException e) {} server.removeClient(s); } }