import java.net.*; import java.io.*; import java.util.*; public class Server extends Thread { private ServerSocket ss; private Vector clientVector = new Vector(); private static int port = 4848; 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); } start(); } public void run() { while(true) { Socket s = null; try { s = ss.accept(); } catch(IOException e) {} addClient(s); } } private synchronized void addClient(Socket s) { clientVector.addElement(s); new ClientHandler(s, this); } public synchronized void removeClient(Socket s) { clientVector.removeElement(s); } public synchronized void broadcast(Socket sFrom, Object o) { for(int i = 0; i < clientVector.size(); i++) { Socket s = (Socket)clientVector.elementAt(i); sendToOne(s, o); } } private synchronized void sendToOne(Socket s, Object o) { try { ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); out.writeObject(o); } catch (IOException e) {} } } 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() { ObjectInputStream in = null; try{ in = new ObjectInputStream(s.getInputStream()); } catch(IOException e) { System.out.println("FAILED: GET INPUTSTREAM FROM CLIENT SOCKET"); server.removeClient(s); return; } Object o; try { while ((o = in.readObject()) != null) { server.broadcast(s, o); } in.close(); s.close(); } catch (Exception e) { } server.removeClient(s); } }