import javax.swing.*; import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*; public class Server extends JFrame implements Runnable { private Thread thread = new Thread(this); private ServerSocket ss; private Vector clientVector = new Vector(); private static int port = 2000; private static boolean visible = true; private JTextArea textArea = new JTextArea(); public static void main(String args[]) { if(args.length != 0) { port = Integer.parseInt(args[0]); if(args.length != 1) { if(args[1].equals("nv")) { visible = false; } } } new Server(); } public Server() { if(visible) { addWindowListener(new L()); getContentPane().add(new JScrollPane(textArea)); setLocation(0, 0); setSize(400, 200); setVisible(true); } try { ss = new ServerSocket(port); setTitle(0); } catch (IOException e) { System.out.println("FAILED: COULD NOT LISTEN ON PORT: " + port); System.exit(1); } thread.start(); } public void run() { while(true) { Socket s = null; try { s = ss.accept(); } catch(IOException e) { System.out.println("FAILED: ACCEPTING CLIENT"); } addClient(s); } } private synchronized void addClient(Socket s) { broadcast(s, "CLIENT CONNECTED: " + getHost(s)); clientVector.addElement(s); setTitle(clientVector.size()); new ClientHandler(s, this); } public synchronized void removeClient(Socket s) { clientVector.removeElement(s); broadcast(s, "CLIENT DISSCONNECTED: " + getHost(s)); setTitle(clientVector.size()); } public synchronized void broadcast(Socket sFrom, String message) { textArea.append("CLIENT: " + getHost(sFrom) + " BROADCAST: " + message + "\n"); // setCaretPosition skapar deadlocks // textArea.setCaretPosition(textArea.getText().length()); 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) { System.out.println("FAILED: SEND TO ONE"); } } public synchronized void who(Socket s) { textArea.append("CLIENT: " + getHost(s) + " ASK: wwhhoo" + "\n"); 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"); } } private void setTitle(int nClients) { setTitle("SERVER ON: " + getHost(ss) + " - PORT: " + port + " - N CLIENTS: " + nClients); } class L extends WindowAdapter { public void windowClosing(WindowEvent we) { dispose(); } public void windowClosed(WindowEvent we) { System.exit(1); } } } 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) { System.out.println("FAILED: GET INPUTSTREAM FROM CLIENT SOCKET"); 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(); System.out.println("CLIENT DISCONNECTED NICELY"); } catch (IOException e) { System.out.println("CLIENT DISCONNECTED BRUTALLY"); } server.removeClient(s); } }