import javax.swing.*; import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*; import java.security.*; import javax.net.ssl.*; public class Server extends JFrame implements Runnable { private Thread thread = new Thread(this); private ServerSocket serverSocket; private Vector clientVector = new Vector(); private int nClients = 0; 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 { //Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); SSLServerSocketFactory sslSSF = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); serverSocket = sslSSF.createServerSocket(port); ((SSLServerSocket)serverSocket).setNeedClientAuth(false); String[] cipherSuites = ((SSLServerSocket)serverSocket).getEnabledCipherSuites(); System.out.println("ENABLED CIPHER SUITES:"); for(int i= 0; i < cipherSuites.length; i++) System.out.println(" " + cipherSuites[i]); String[] encs = new String[cipherSuites.length + 1]; for(int len = 0; len < cipherSuites.length; len++) encs[len] = cipherSuites[len]; encs[cipherSuites.length] = "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"; ((SSLServerSocket)serverSocket).setEnabledCipherSuites(encs); setTitle(nClients); } catch (IOException e) { System.out.println("COULD NOT LISTEN ON PORT: " + port + " ERROR: " + e); System.exit(1); } thread.start(); } public void run() { while(true) { Socket clientSocket = null; try { System.out.println("WAITING FOR CLIENT"); clientSocket = serverSocket.accept(); System.out.println("CLIENT CONNECTED"); String[] cipherSuites = ((SSLSocket)clientSocket).getEnabledCipherSuites(); System.out.println("ENABLED CIPHER SUITES:"); for(int i= 0; i < cipherSuites.length; i++) System.out.println(" " + cipherSuites[i]); String[] encs = new String[cipherSuites.length + 1]; for(int len = 0; len < cipherSuites.length; len++) encs[len] = cipherSuites[len]; encs[cipherSuites.length] = "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"; ((SSLSocket)clientSocket).setEnabledCipherSuites(encs); } catch(IOException ioe) { System.out.println("IOException generated: " + ioe); } if(clientSocket != null) { addClient(clientSocket); } } } private synchronized void addClient(Socket clientSocket) { broadcast(clientSocket, "CLIENT CONNECTED: " + getHost(clientSocket)); clientVector.addElement(clientSocket); setTitle(clientVector.size()); new ClientHandler(clientSocket, this); } public synchronized void removeClient(Socket clientSocket) { clientVector.removeElement(clientSocket); broadcast(clientSocket, "CLIENT DISSCONNECTED: " + getHost(clientSocket)); setTitle(clientVector.size()); } public synchronized void broadcast(Socket fromClientSocket, String message) { textArea.append("CLIENT: " + getHost(fromClientSocket) + " BROADCAST: " + message + "\n"); textArea.setCaretPosition(textArea.getText().length()); for(int i = 0; i < clientVector.size(); i++) { SSLSocket clientSocket = (SSLSocket)clientVector.elementAt(i); sendToOne(clientSocket, message); } } private synchronized void sendToOne(Socket clientSocket, String message) { try { PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); out.println(message); } catch (IOException e) { System.out.println("IOException generated\n"); } } public synchronized void who(Socket clientSocket) { textArea.append("CLIENT: " + getHost(clientSocket) + " ASK: wwhhoo" + "\n"); for(int i = 0; i < clientVector.size(); i++) { Socket clientSocketTmp = (SSLSocket)clientVector.elementAt(i); String hostTmp = getHost(clientSocketTmp); sendToOne(clientSocket, "WWHHOO: " + hostTmp); } } private String getHost(Socket socket) { return(socket.getInetAddress().getHostName()); } private String getHost(ServerSocket serverSocket) { try { return(serverSocket.getInetAddress().getLocalHost().getHostName()); } catch(java.net.UnknownHostException uhe) { return("UNKOWN SERVER HOST"); } } private void setTitle(int nClients) { setTitle("SERVER ON: " + getHost(serverSocket) + " - 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 s; private Socket clientSocket; public ClientHandler(Socket clientSocket, Server s) { this.clientSocket = clientSocket; this.s = s; start(); } public void run() { BufferedReader in = null; try{ in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } catch(IOException e) { System.out.println("IOException generated"); killMe(); return; } String exitStr = "exit"; String inputLine = ""; while(true) { try { inputLine = in.readLine(); } catch(NullPointerException e) { System.out.println("NullPointer generated"); inputLine = exitStr; } catch(IOException e){ System.out.println("IOException generated"); inputLine = exitStr; } try { if(inputLine.equals(exitStr)) { break; } } catch(NullPointerException e) { break; } if(inputLine.equals("wwhhoo")) s.who(clientSocket); else s.broadcast(clientSocket, inputLine); } killMe(); } private void killMe() { s.removeClient(clientSocket); try { clientSocket.close(); clientSocket = null; } catch (IOException e) { System.out.println("IOException generated"); } } }