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); show(); } 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); } } // Lagt till för enkla HTTP-förfrågningar via ex AJAX public synchronized void http(Socket s, String message) { textArea.append("CLIENT: " + getHost(s) + " ASK: GET or POST" + "\n"); String http = "HTTP/1.0 200 OK\r\n"; http = http + "Connection: close\r\n"; http = http + "Server: SimpleHTTPServer v0\r\n"; http = http + "Content-Type: text/plain\r\n"; http = http + "\r\n"; http = http + message; sendToOne(s, http); } 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; boolean loopit = true; try { while(((inputLine = in.readLine()) != null) && loopit) { if(inputLine.equals("wwhhoo")) { server.who(s); } else if(inputLine.startsWith("GET")) { // Här får vi det som sänds med (path osv) String[] parts = inputLine.split(" "); // Här kan man sända vilken text som helst, vi ekar bara det vi tagit ut ovan server.http(s, parts[1]); loopit = false; } 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); } }