-4

Hi I downloaded Bucky's Messager and instead of having multiple clients connected to it, it has them wait to connect to the server. How could I make it so multiple clients could connect to the server at once? I would love it if you could edit the code for me and tell me what to edit. Here is the code:

Client.java:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Client extends JFrame{

   private JTextField userText;
   private JTextArea chatWindow;
   private ObjectOutputStream output;
   private ObjectInputStream input;
   private String message = "";
   private String serverIP;
   private Socket connection;

   //constructor
   public Client(String host){
      super("Client mofo!");
      serverIP = host;
      userText = new JTextField();
      userText.setEditable(false);
      userText.addActionListener(
         new ActionListener(){
            public void actionPerformed(ActionEvent event){
               sendMessage(event.getActionCommand());
               userText.setText("");
            }
         }
      );
      add(userText, BorderLayout.NORTH);
      chatWindow = new JTextArea();
      add(new JScrollPane(chatWindow), BorderLayout.CENTER);
      setSize(300,150);
      setVisible(true);
   }

   //connect to server
   public void startRunning(){
      try{
         connectToServer();
         setupStreams();
         whileChatting();
      }catch(EOFException eofException){
         showMessage("\n Client terminated connection");
      }catch(IOException ioException){
         ioException.printStackTrace();
      }finally{
         closeCrap();
      }
   }

   //connect to server
   private void connectToServer() throws IOException{
      showMessage("Attempting connection... \n");
      connection = new Socket(InetAddress.getByName(serverIP), 6789);
      showMessage("Connected to: " + connection.getInetAddress().getHostName() );
   }

   //set up streams to send and receive messages
   private void setupStreams() throws IOException{
      output = new ObjectOutputStream(connection.getOutputStream());
      output.flush();
      input = new ObjectInputStream(connection.getInputStream());
      showMessage("\n Dude your streams are now good to go! \n");
   }

   //while chatting with server
   private void whileChatting() throws IOException{
      ableToType(true);
      do{
         try{
            message = (String) input.readObject();
            showMessage("\n" + message);
         }catch(ClassNotFoundException classNotfoundException){
            showMessage("\n I dont know that object type");
         }
      }while(!message.equals("SERVER - END"));
   }

   //close the streams and sockets
   private void closeCrap(){
      showMessage("\n closing crap down...");
      ableToType(false);
      try{
         output.close();
         input.close();
         connection.close();
      }catch(IOException ioException){
         ioException.printStackTrace();
      }
   }

   //send messages to server
   private void sendMessage(String message){
      try{
         output.writeObject("CLIENT - " + message);
         output.flush();
         showMessage("\nCLIENT - " + message);
      }catch(IOException ioException){
         chatWindow.append("\n something messed up sending message hoss!");
      }
   }

   //change/update chatWindow
   private void showMessage(final String m){
      SwingUtilities.invokeLater(
         new Runnable(){
            public void run(){
               chatWindow.append(m);
            }
         }
      );
   }

   //gives user permission to type crap into the text box
   private void ableToType(final boolean tof){
      SwingUtilities.invokeLater(
         new Runnable(){
            public void run(){
               userText.setEditable(tof);
            }
         }
      );      
   }
}

ClientTest.java:

import javax.swing.JFrame;

public class ClientTest {
   public static void main(String[] args) {
      Client charlie;
      charlie = new Client("127.0.0.1");
      charlie.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      charlie.startRunning();
   }
}

Server.java:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Server extends JFrame{

   private JTextField userText;
   private JTextArea chatWindow;
   private ObjectOutputStream output;
   private ObjectInputStream input;
   private ServerSocket server;
   private Socket connection;

   //constructor
   public Server(){
      super("Buckys Instant Messenger");
      userText = new JTextField();
      userText.setEditable(false);
      userText.addActionListener(
         new ActionListener(){
            public void actionPerformed(ActionEvent event){
               sendMessage(event.getActionCommand());
               userText.setText("");
            }
         }
      );
      add(userText, BorderLayout.NORTH);
      chatWindow = new JTextArea();
      add(new JScrollPane(chatWindow));
      setSize(300,150);
      setVisible(true);
   }

   //set up and run the server
   public void startRunning(){
      try{
         server = new ServerSocket(6789, 100);
         while(true){
            try{
               waitForConnection();
               setupStreams();
               whileChatting();
            }catch(EOFException eofException){
               showMessage("\n Server ended the connection! ");
            }finally{
               closeCrap();
            }
         }
      }catch(IOException ioException){
         ioException.printStackTrace();
      }
   }

   //wait for connection, then display connection information
   private void waitForConnection() throws IOException{
      showMessage(" Waiting for someone to connect... \n");
      connection = server.accept();
      showMessage(" Now connected to " + connection.getInetAddress().getHostName());
   }

   //get stream to send and receive data
   private void setupStreams() throws IOException{
      output = new ObjectOutputStream(connection.getOutputStream());
      output.flush();
      input = new ObjectInputStream(connection.getInputStream());
      showMessage("\n Streams are now setup! \n");
   }

   //during the chat conversation
   private void whileChatting() throws IOException{
      String message = " You are now connected! ";
      sendMessage(message);
      ableToType(true);
      do{
         try{
            message = (String) input.readObject();
            showMessage("\n" + message);
         }catch(ClassNotFoundException classNotFoundException){
            showMessage("\n idk wtf that user sent!");
         }
      }while(!message.equals("CLIENT - END"));
   }

   //close streams and sockets after you are done chatting
   private void closeCrap(){
      showMessage("\n Closing connections... \n");
      ableToType(false);
      try{
         output.close();
         input.close();
         connection.close();
      }catch(IOException ioException){
         ioException.printStackTrace();
      }
   }

   //send a message to client
   private void sendMessage(String message){
      try{
         output.writeObject("SERVER - " + message);
         output.flush();
         showMessage("\nSERVER - " + message);
      }catch(IOException ioException){
         chatWindow.append("\n ERROR: DUDE I CANT SEND THAT MESSAGE");
      }
   }

   //updates chatWindow
   private void showMessage(final String text){
      SwingUtilities.invokeLater(
         new Runnable(){
            public void run(){
               chatWindow.append(text);
            }
         }
      );
   }

   //let the user type stuff into their box
   private void ableToType(final boolean tof){
      SwingUtilities.invokeLater(
         new Runnable(){
            public void run(){
               userText.setEditable(tof);
            }
         }
      );
   }

}

ServerTest.java:

import javax.swing.JFrame;

public class ServerTest {
   public static void main(String[] args) {
      Server sally = new Server();
      sally.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      sally.startRunning();
   }
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
user1970995
  • 3
  • 1
  • 3

2 Answers2

2

make your serverTest.java in form of a thread and it will allow for multiple clients

thwildfire
  • 76
  • 9
  • Im not super experienced with threads in this subject, how would I do that? And Thx – user1970995 May 10 '13 at 02:18
  • That would be very helpful – user1970995 May 10 '13 at 02:28
  • please download this book The Java(tm) Tutorial A practical guide for programmers and find the knockknock client app tutorial – thwildfire May 10 '13 at 02:32
  • http://www.google.co.zm/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDAQFjAA&url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2Ftutorial%2F&ei=JF6MUfi8BIqWhQfu4YDYCA&usg=AFQjCNHohD0Cv4ea4bkZEjS1UWkOviLTAQ&bvm=bv.46340616,d.ZG4 – thwildfire May 10 '13 at 02:40
1

Hi I downloaded Bucky's Messager and instead of having multiple clients connected to it, it has them wait to connect to the server. How could I make it so multiple clients could connect to the server at once?

As has been noted, your current borrowed code is single-threaded: the server creates only one thread and blocks its single thread while it listens on that thread. The solution requires several changes:

  • First, you need to have all your chatting be done off of the Swing event thread in a background thread. A SwingWorker would work well for this, and there are decent tutorials to be found for this subject.
  • Next, the server needs to create a new thread for each connection so that when a connection is created and communicated with, it doesn't block the server from listening for more connections.

I would love it if you could edit the code for me and tell me what to edit. Here is the code:

This is not going to happen as you're asking way too much of volunteers. You will need to study threading and try to implement this yourself. I'd suggest starting with non-GUI socket programming before porting it to a Swing GUI.

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373