import java.net.*; import java.io.*; import java.util.*; public class AquaServer { static Vector clientList= new Vector(); static PrintWriter screenOut = new PrintWriter(System.out, true); static ServerSocket serverSocket = null; public static void main(String[] args) throws IOException { boolean listening = true; CommandReader tempCommand; Thread tempThread; AquaClientThread tempClient; int currentNode; screenOut.println("A|Q|U|A Server v1.5"); screenOut.println(" Copyright 2000 by Branden J. Hall of Fig Leaf Software"); screenOut.println(" http://www.figleaf.com | bhall@figleaf.com"); screenOut.println("------------------------------------------------------"); screenOut.println(" Authors notes:"); screenOut.println(" The server now supports commands. Type HELP to see the"); screenOut.println(" list of supported commands. Thanks to Dave Watts, "); screenOut.println(" Kurt Hakenson, Patti Lee, and the rest of the "); screenOut.println(" Notorius F.I.G."); screenOut.println("------------------------------------------------------"); if (args.length >= 1){ Integer tempPort = new Integer(args[0]); try{ serverSocket = new ServerSocket(tempPort.intValue()); }catch(IOException e){ System.err.println("Could not listen on port: "+args[0]); System.exit(-1); } screenOut.println("Server started and listening on port "+args[0]+"\n"); screenOut.print(">"); screenOut.flush(); tempCommand = new CommandReader(); tempCommand.start(); while (listening){ try{ tempClient = new AquaClientThread(serverSocket.accept()); clientList.add(tempClient); tempThread = new Thread(tempClient); tempThread.start(); } catch (IOException e){ } } serverSocket.close(); }else{ screenOut.println("Error: incorrect number of arguments"); screenOut.println("usage: java AquaServer <port>"); screenOut.println("Where <port> is an unused port greater than 1024 that the"); screenOut.println("server will listen on."); System.exit(-1); } } static void sendToAllClients(String message){ int i; AquaClientThread foo; AquaClientThread tempClient; for (i=0;i<clientList.size();++i){ foo = (AquaClientThread)clientList.get(i); foo.send(message); } } static void listClients(){ int i; AquaClientThread foo; for (i=0;i<clientList.size();++i){ foo = (AquaClientThread)clientList.get(i); screenOut.println(" Client "+(i+1)+": "+foo.clientIP); } } static void deleteClient(AquaClientThread deadClient){ int num; num=clientList.indexOf(deadClient); clientList.remove(num); } } class CommandReader extends Thread{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); PrintWriter screenOut = new PrintWriter(System.out, true); String command; public CommandReader(){ super("CommandReader"); } public void run(){ boolean valid; try{ while ((command = in.readLine()) != null){ valid = false; command = command.trim().toUpperCase(); if (command.compareTo("QUIT")==0){ valid = true; AquaServer.serverSocket.close(); System.exit(0); } if (command.compareTo("LIST")==0){ valid = true; screenOut.println(""); AquaServer.listClients(); screenOut.println(""); } if (command.compareTo("HELP")==0){ valid = true; screenOut.println("\n LIST - lists all currently connected clients"); screenOut.println(" QUIT - disconnects all clients and exits\n"); } if (!valid){ screenOut.println("\nError: Not a supported command\n"); } screenOut.print(">"); screenOut.flush(); } } catch (IOException e){ e.printStackTrace(); } } }; class AquaClientThread extends Thread { PrintWriter screenOut = new PrintWriter(System.out, true); private Socket socket = null; public String clientIP; public PrintWriter out; public BufferedReader in; public AquaClientThread(Socket socket){ super("AquaClientThread"); this.socket = socket; } public void run(){ clientIP = socket.getInetAddress().getHostAddress(); try{ out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader (new InputStreamReader(socket.getInputStream())); String inputLine; int streamResult; char buf[] = new char[1]; do{ inputLine = ""; do{ streamResult = in.read(buf, 0, 1); inputLine += buf[0]; } while (buf[0] != '\u0000'); AquaServer.sendToAllClients(inputLine); } while (streamResult != -1); AquaServer.deleteClient(this); in.close(); out.close(); socket.close(); }catch(IOException e){ e.printStackTrace(); } } public void send(String message){ out.println(message); } }