title: Server alternates between users instead of broadcasting
body: <p>I have been working on a message system where users type in a server IP/Port and that server then takes in messages and relays them to all other users on the server.  The whole program was based of a echo server i rewrote from scratch, for every server.accept() socket it creates two Threads, one to receive messages and one to send them back.  The two Threads are connected by a DatagramPacket system so if the server receives a message from one socket it sends it back to all other users because their Threads are listening for the same thing, this is where i am encountering problems; everything work fine except the fact that the user who receives the message alternates in order to time of log on.</p>
  
  <p>Example of problem when two clients are connected:</p>
  
  <p>Client #1 sends 10 messages:</p>
  
  <pre><code>0
  1
  2
  3
  4
  5
  6
  7
  8
  9
  </code></pre>
  
  <p>The Server receives all of them.</p>
  
  <p>Client #1 receives:</p>
  
  <pre><code>1
  3
  5
  7
  9
  </code></pre>
  
  <p>Client #2 receives:</p>
  
  <pre><code>0
  2
  4
  6
  8
  </code></pre>
  
  <p>Here is the code for the Client:</p>
  
  <pre><code>import java.io.*;
  import java.util.*;
  import java.net.*;
  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  
  public class MessageClient {
      public static void main(String[] args) {
          System.out.println("Starting Message System...");
          Scanner in = new Scanner(System.in);
          MessageClient mc = new MessageClient();
          String input;
          System.out.println(":System Started, type help for help.");
          System.out.print(":");
          while (true) {
              input = in.nextLine();
              if (input.equalsIgnoreCase("HELP")) {
                  mc.printHelp();
                  System.out.print(":");
              } else if (input.equalsIgnoreCase("QUIT")) {
                  System.exit(0);
              } else if (input.equalsIgnoreCase("CONNECT")) {
                  mc.connect(in);
                  in.nextLine();
                  System.out.print(":");
              } else {
                  System.out.print("No command found.\n:");
              }
          }
      }
      public static void printHelp() {
          System.out.println("help\tShow this prompt\nconnect\tStarts a new connection\nquit\tQuit the program\nexit\tExit a connection");
      }
      public void connect(Scanner in) {
          Socket soc = null;
          InetAddress addr = null;
          System.out.print("IP_ADDRESS/HOST:");
          String ip = in.nextLine();
          System.out.print("PORT:");
          int port = in.nextInt();
          try {
              System.out.println("Attempting to connect to HOST:\'" + ip + "\' on PORT:\'" + port + "\'");
              addr = InetAddress.getByName(ip);
              soc = new Socket(addr, port);
          } catch(Exception e) {
              System.out.println("Error connecting to server: " + e.getLocalizedMessage());
              return;
          }
          SwingUtilities.invokeLater(new MessageGUI(ip + ":" + port, soc));
      }
  }
  
  class MessageGUI implements Runnable {
      public MessageGUI(String windowName, Socket server) {
          JFrame window = new JFrame(windowName);
          window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          window.setSize(500, 300);
          window.setLayout(new BorderLayout());
          window.setVisible(true);
  
          MessageReceive mr = new MessageReceive(server);
          mr.setEditable(false);
          mr.setBackground(new Color(0, 0, 0));
          mr.setForeground(new Color(0, 255, 0));
          mr.setVisible(true);
          new Thread(mr).start();
          window.add(mr, BorderLayout.CENTER);
  
          DataOutputStream dos = null;
          try {
              dos = new DataOutputStream(server.getOutputStream());
          } catch(Exception e) {
              System.out.println("Error creating output stream to server: " + e.getLocalizedMessage());
          }
  
          JTextField input = new JTextField();
          input.addActionListener(new MessageSend(server, input, dos));
          input.setBackground(new Color(0, 0, 0));
          input.setForeground(new Color(0, 255, 0));
          window.add(input, BorderLayout.PAGE_END);
  
          System.out.println("Displaying connection.");
      }
      public void run() {}
  }
  
  class MessageReceive extends JTextArea implements Runnable {
      protected Socket server;
      public MessageReceive(Socket server) {
          this.server = server;
      }
      public void run() {
          DataInputStream dis = null;
          int bytes;
          try {
              dis = new DataInputStream(server.getInputStream());
          } catch(Exception e) {
              System.out.println("Error connecting server: " + e.getLocalizedMessage());
          }
          this.append("Connected.\n");
          while (true) {
              try {
                  while ((bytes = dis.read()) != -1) this.append(String.valueOf((char) bytes));
              } catch(Exception e) {
                  System.out.println("Error reading from server: " + e.getLocalizedMessage());
                  return;
              }
          }
      }
  }
  
  class MessageSend implements ActionListener {
      protected Socket server;
      protected JTextField input;
      protected DataOutputStream dos = null;
      public MessageSend(Socket server, JTextField input, DataOutputStream dos) {
          this.server = server;
          this.input = input;
          this.dos = dos;
      }
      public void actionPerformed(ActionEvent ae) {
          try {
              dos.writeBytes(input.getText() + "\n");
              input.setText("");
          } catch(Exception e) {
              System.out.println("Error writing to server output stream: " + e.getLocalizedMessage());
          }
      }
  }
  </code></pre>
  
  <p>Here is the code for the Server:</p>
  
  <pre><code>import java.io.*;
  import java.net.*;
  import java.util.*;
  
  public class MessageServer {
      public static void main(String[] args) {
          int port = Integer.parseInt(args[0]);
          MessageServer ms = new MessageServer();
          System.out.println("Starting server on port " + port + "...");
          ServerSocket ss = null;
          try {
              ss = new ServerSocket(port);
          } catch(Exception e) {
              System.out.println("Error creating server: " + e.getLocalizedMessage());
              System.exit(0);
          }
          System.out.println("Created server port, now waiting for users...");
          Socket client = null;
          DatagramSocket ds = null;
          try {
              ds = new DatagramSocket(4);
          } catch(Exception e) {
              System.out.println("IN:Error creating Datagram Server: " + e.getLocalizedMessage());
              e.printStackTrace();
              System.exit(0);
          }
          while (true) {
              try {
                  client = ss.accept();
                  System.out.println("Connecting user: " + client.getInetAddress().toString());
              } catch(Exception e) {
                  System.out.println("Error on server: " + e.getLocalizedMessage());
              }
              new MessageConnectionIn(client, ds).start();
              new MessageConnectionOut(client, ds).start();
          }
      }
  }
  
  class MessageConnectionOut extends Thread {
      protected Socket client;
      public DatagramSocket ds;
      public MessageConnectionOut(Socket client, DatagramSocket ds) {
          this.client = client;
          this.ds = ds;
      }
      public void run() {
          this.setName(client.getInetAddress().getHostAddress() + ":OUT");
          try {
              System.out.println("OUT:User connected.");
              DataOutputStream dos = new DataOutputStream(client.getOutputStream());
              while (true) {
                  byte[] outgoing = new byte[4096];
                  DatagramPacket dp = new DatagramPacket(outgoing, outgoing.length);
                  ds.receive(dp);
                  dos.writeChars(new String(outgoing) + "\n");
              }
          } catch(Exception e) {
              System.out.println("OUT:Error connecting " + this.getName() + ": " + e.getLocalizedMessage());
              return;
          }
      }
  }
  
  class MessageConnectionIn extends Thread {
      protected Socket client;
      public DatagramSocket ds;
      public MessageConnectionIn(Socket client, DatagramSocket ds) {
          this.client = client;
          this.ds = ds;
      }
      public void run() {
          this.setName(client.getInetAddress().getHostAddress() + ":IN");
          try {
              System.out.println("IN:User connected.");
              BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
              while (true) {
                  String lineIn = br.readLine();
                  byte[] input = lineIn.getBytes();
                  System.out.println(lineIn);
                  byte[] output = new byte[4096];
                  for (int c = 0; c &lt; output.length; c++) output[c] = 0x0;
                  for (int i = 0; i &lt; input.length &amp;&amp; i &lt; output.length; i++) output[i] = input[i];
                  DatagramPacket dp = new DatagramPacket(output, output.length, InetAddress.getLocalHost(), 4);
                  ds.send(dp);
              }
          } catch(Exception e) {
              System.out.println("IN:Error connecting to " + this.getName() + ": " + e.getLocalizedMessage());
              return;
          }
      }
  }
  </code></pre>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>I tried replacing all the DatagramSockets with MulticastSockets and adding it to a group when I declared it, MessageServer.main().  The same problem occurred.</p>
  
  <p>Multicast code:</p>
  
  <pre><code>public class MessageServer {
      public static void main(String[] args) {
          int port = Integer.parseInt(args[0]);
          MessageServer msgsrv = new MessageServer();
          System.out.println("Starting server on port " + port + "...");
          ServerSocket ss = null;
          try {
              ss = new ServerSocket(port);
          } catch(Exception e) {
              System.out.println("Error creating server: " + e.getLocalizedMessage());
              System.exit(0);
          }
          System.out.println("Created server port, now waiting for users...");
          Socket client = null;
          MulticastSocket ms = null;
          try {
              ms = new MulticastSocket(4);
              ms.joinGroup(InetAddress.getByName("225.65.65.65"));
          } catch(Exception e) {
              System.out.println("IN:Error creating Datagram Server: " + e.getLocalizedMessage());
              e.printStackTrace();
              System.exit(0);
          }
          while (true) {
              try {
                  client = ss.accept();
                  System.out.println("Connecting user: " + client.getInetAddress().toString());
              } catch(Exception e) {
                  System.out.println("Error on server: " + e.getLocalizedMessage());
              }
              new MessageConnectionIn(client, ms).start();
              new MessageConnectionOut(client, ms).start();
          }
      }
  }
  
  class MessageConnectionOut extends Thread {
      protected Socket client;
      public MulticastSocket ms;
      public MessageConnectionOut(Socket client, MulticastSocket ms) {
          this.client = client;
          this.ms = ms;
      }
      public void run() {
          this.setName(client.getInetAddress().getHostAddress() + ":OUT");
          try {
              System.out.println("OUT:User connected.");
              DataOutputStream dos = new DataOutputStream(client.getOutputStream());
              while (true) {
                  byte[] outgoing = new byte[4096];
                  DatagramPacket dp = new DatagramPacket(outgoing, outgoing.length);
                  ms.receive(dp);
                  dos.writeChars(new String(outgoing) + "\n");
                  System.out.println("SENT_TO:" + this.getName());
              }
          } catch(Exception e) {
              System.out.println("OUT:Error connecting " + this.getName() + ": " + e.getLocalizedMessage());
              return;
          }
      }
  }
  
  class MessageConnectionIn extends Thread {
      protected Socket client;
      public MulticastSocket ms;
      public MessageConnectionIn(Socket client, MulticastSocket ms) {
          this.client = client;
          this.ms = ms;
      }
      public void run() {
          this.setName(client.getInetAddress().getHostAddress() + ":IN");
          try {
              System.out.println("IN:User connected.");
              BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
              while (true) {
                  String lineIn = br.readLine();
                  byte[] input = lineIn.getBytes();
                  System.out.println(lineIn);
                  byte[] output = new byte[4096];
                  for (int c = 0; c &lt; output.length; c++) output[c] = 0x0;
                  for (int i = 0; i &lt; input.length &amp;&amp; i &lt; output.length; i++) output[i] = input[i];
                  DatagramPacket dp = new DatagramPacket(output, output.length, InetAddress.getLocalHost(), 4);
                  ms.send(dp);
              }
          } catch(Exception e) {
              System.out.println("IN:Error connecting to " + this.getName() + ": " + e.getLocalizedMessage());
              return;
          }
      }
  }
  </code></pre>