title: Java: Client-Server, chat broadcasting
body: <p>I"m working on a Client-Server chat program for a university project and I have little programming background. I've made 3 classes: <strong>ChatClient</strong>, <strong>ChatServer</strong> and <strong>ChatServerThread</strong>. I can currently have multiple clients connected and talking to the server at any time. </p>
  
  <p>Although one of the requirements that I'm having the most difficulty is this: "Any message typed from 1 client is sent to all other clients" and also "Both sent and received messages should be displayed".</p>
  
  <p>I've spent the last few nights just trying to get this extra bit of functionality working but have had no luck. </p>
  
  <p>I've been reading and looking around for a while but I have lots of difficulty adapting online examples to my work. I've read that I should be creating a list of sockets and then iterate through the list and send data to everyone in the list, which makes sense in my head but gives me a headache when I try implementing it. Any help with this would be very greatly appreciated. Extra points if anyone can give me some insight on how I could encrypt the sent data.</p>
  
  <p><strong>ChatClient</strong></p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  
  public class ChatClient {
      private Socket socket = null;
      private DataInputStream console = null;
      private DataOutputStream streamOut = null;
      private String myName = null;
      private BufferedReader StreamIn = null;
      private String response = null;
  
      public ChatClient(String serverName, int serverPort) {
          try {
              console = new DataInputStream(System.in);
              System.out.println("What is your name?");
              myName = console.readLine();
              System.out.println(myName + " &lt;" + InetAddress.getLocalHost() + "&gt; ");
          } catch (IOException ioe) {
              System.out.println("Unexpected exception: " + ioe.getMessage());
          }
          System.out.println("Establishing connection. Please wait ...");
          try {
              socket = new Socket(serverName, serverPort);
              System.out.println("Connected: " + socket);
              StreamIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              streamOut = new DataOutputStream(socket.getOutputStream());
              streamOut.writeUTF(":" + myName + " &lt;" + InetAddress.getLocalHost() + "&gt; HAS JOINED");
              streamOut.flush();
          } catch (UnknownHostException uhe) {
              System.out.println("Host unknown: " + uhe.getMessage());
          } catch (IOException ioe) {
              System.out.println("Unexpected exception: " + ioe.getMessage());
          }
          String line = "";
          while (!line.equals(".bye")) {
              try {
                  line = console.readLine();
                  streamOut.writeUTF(myName + " &lt;" + InetAddress.getLocalHost() + "&gt; : " + line);
                  streamOut.flush();
  
              } catch (IOException ioe) {
                  System.out.println("Sending error: " + ioe.getMessage());
              }
          }
      }
  
      public void stop() {
          try {
              if (console != null) console.close();
              if (streamOut != null) streamOut.close();
              if (socket != null) socket.close();
          } catch (IOException ioe) {
              System.out.println("Error closing ...");
          }
      }
  
      public static void main(String args[]) {
          ChatClient client = null;
          if (args.length != 2)
              System.out.println("Usage: java ChatClient host port");
          else
              client = new ChatClient(args[0], Integer.parseInt(args[1]));
      }
  }
  </code></pre>
  
  <p><strong>ChatServer</strong></p>
  
  <pre><code> import java.net.*;
  import java.io.*;
  import java.util.*;
  
  public class ChatServer implements Runnable {
      private ServerSocket server = null;
      private Thread thread = null;
      private ChatServerThread client = null;
      private String clientSentence = null;
      private int peers = 0;
      private List clients = new ArrayList();
      final List sockets = new ArrayList();
  
      public ChatServer(int port) {
          try {
              System.out.println("Binding to port " + port + ", please wait  ...");
              server = new ServerSocket(port);
              System.out.println("Server started: " + server);
              start();
          } catch (IOException ioe) {
              System.out.println(ioe);
          }
      }
  
      public void run() {
          while (thread != null) {
              try {
                  System.out.println("Waiting for a client ...");
                  addThread(server.accept());
              } catch (IOException ie) {
                  System.out.println("Acceptance Error: " + ie);
              }
          }
      }
  
      public void addThread(Socket socket) {
          System.out.println("Client accepted: " + socket);
          client = new ChatServerThread(this, socket);
          try {
              client.open();
              client.start();
          } catch (IOException ioe) {
              System.out.println("Error opening thread: " + ioe);
          }
      }
  
      public void start() {
          if (thread == null) {
              thread = new Thread(this);
              thread.start();
          }
      }
  
      public void stop() {
          if (thread != null) {
              thread.stop();
              thread = null;
          }
      }
  
      public void increment(String sentence) {
          peers++;
          String[] info = sentence.split(" ");
          String name = info[0].replace(":", "");
          System.out.println(name + " Has joined the room, we now have " + peers + " peer(s).");
          clients.add(name);
      }
  
      public Boolean isAllowed(String name, Socket socket) {
          try {
              String stringSearch = name;
              BufferedReader bf = new BufferedReader(new FileReader("allowed.txt"));
              int linecount = 0;
              String line = "";
              System.out.println("Searching for " + stringSearch + " in file...");
              while ((line = bf.readLine()) != null) {
                  linecount++;
                  String[] words = line.split(" ");
  
                  for (String word : words) {
                      if (word.equals(stringSearch)) {
                          System.out.println("User is allowed");
                          registerSocket(socket);
                          return true;
                      }
                  }
              }
              bf.close();
          } catch (IOException e) {
              System.out.println("IO Error Occurred: " + e.toString());
          }
          System.out.println("User is not allowed");
          return false;
      }
  
      public void showAll() {
          for (int i = 0; i &lt; clients.size(); i++) {
              System.out.print(clients.get(i));
          }
      }
  
      public void registerSocket(Socket socket) {
          //socket = new DataOutputStream(socket.getOutputStream());   
          sockets.add(socket);
          for (int i = 0; i &lt; sockets.size(); i++) {
              System.out.println(sockets.get(i));
          }
      }
  
      public static void main(String args[]) {
          ChatServer server = null;
          if (args.length != 1)
              System.out.println("Usage: java ChatServer port");
          else
              server = new ChatServer(Integer.parseInt(args[0]));
      }
  }
  </code></pre>
  
  <p><strong>ChatServerThread</strong></p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  
  public class ChatServerThread extends Thread {
      private Socket socket = null;
      private ChatServer server = null;
      private int ID = -1;
      private DataInputStream streamIn = null;
      private String clientSentence = null;
      public String newGuy = null;
      DataOutputStream streamOut = null;
  
      public ChatServerThread(ChatServer _server, Socket _socket) {
          server = _server;
          socket = _socket;
          ID = socket.getPort();
      }
  
      public void run() {
          System.out.println("Server Thread " + ID + " running.");
          while (true) {
              try {
                  String sentence = streamIn.readUTF();
                  //System.out.println(sentence);
                  char c = sentence.charAt(0);
                  String[] command = null;
                  command = sentence.split(" ");
                  String name = command[0].substring(1);
  
                  System.out.println("Sending out: " + sentence + " via ");
  
                  streamOut.writeBytes(sentence);
  
                  if (c == ':') {
                      if (server.isAllowed(name, socket))
                          server.increment(sentence);
                      else {
                          close();
                      }
                  }
              } catch (IOException ioe) {
              }
          }
      }
  
      public void open() throws IOException {
          streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
      }
  
      public void close() throws IOException {
          if (socket != null) socket.close();
          if (streamIn != null) streamIn.close();
      }
  }
  </code></pre>