0

I am sorry, I have a problem here, believe me I have tried as much as I can. But unfortunately couldn't get the back of it, before thinking of posting for help. And thank you in advance for your time and effort.

I am trying to update my Client JList (userList) so that when a new client comes in, the initial client would be updated. but at present, when there's a single client, it can see itself but when another client enters the chat, only that client sees the two clients connected, the initial client is not updated with the name on the JList. Please help simplify any answer because I am not expert in Java. Thank you!

The ClientChat Code:

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

  public class  ClientChat extends JFrame {
private Toolkit toolkit; 
private JLabel msgLabel;
private JButton sendBtn;
private JTextArea genMsg;
public static JList userList;
private JTextField msgF;
private ObjectOutputStream output;
private ObjectInputStream input;
private Socket client;
private String chatServer;
private int serverport;
private String Client_name;

public ClientChat( String host, int port,String C_Name){

    // set server to which this client connects
    chatServer = host;
    serverport = port;
    Client_name = C_Name;


    toolkit = Toolkit.getDefaultToolkit();      
    if(toolkit.getScreenSize().getWidth() > 600)
        setSize(600, 605);
    else
        setSize((int)toolkit.getScreenSize().getWidth(),(int)toolkit.getScreenSize().getHeight() - 20);         
        setResizable(false);
        Dimension dimension = getSize();    
        setLayout(new FlowLayout());

        setTitle("FRESHER MARKETING COMPANY");      
        addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0);}});

        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        // create General Message Screen
        genMsg = new JTextArea(30,43);
        genMsg.setEditable(false);
        genMsg.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
        container.add( new JScrollPane( genMsg ));
        JPanel genMsgPanel = new JPanel();
        genMsgPanel.setLayout(new BorderLayout());
        genMsgPanel.add(new JScrollPane(genMsg), BorderLayout.EAST);
        genMsgPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
        container.add(genMsgPanel);

        // create Friend List View
        userList = new JList();
        userList.setPreferredSize(new Dimension(150,423));
        userList.setFont(new java.awt.Font("Times New Roman", 0, 12)); // NOI18N
        container.add(userList);
        JPanel userListPanel = new JPanel();
        userListPanel.setLayout(new BorderLayout());
        userListPanel.add(userList, BorderLayout.CENTER);
        userListPanel.setBorder(BorderFactory.createLineBorder(Color.black));   
        container.add(userListPanel);

        msgLabel = new JLabel ("Message:");
        container.add(msgLabel);
        JPanel msgFPanel = new JPanel();
        msgFPanel.setLayout(new BorderLayout());
        msgFPanel.add(new JScrollPane(msgLabel), BorderLayout.WEST);
        container.add(msgFPanel);

        // create Message Field
        msgF = new JTextField(37);
        msgF.setEnabled( true );
        msgF.setText("");
        msgF.requestFocus();
        msgF.addActionListener(
            new ActionListener() {

            // send message to server
                public void actionPerformed( ActionEvent event )
                {
                    //sendData( event.getActionCommand() );
                }
            } // end anonymous inner class
            ); // end call to addActionListener
        msgFPanel.add(new JScrollPane(msgF), BorderLayout.CENTER);
            }
public void runClient()
{
    // connect to server, get streams, process connection
    try {
        // Step 1: Create a Socket to make connection
        connectToServer();
        // Step 2: Get the input and output streams
        getStreams();
        handShake();
    }// server closed connection
    catch ( EOFException eofException ) {
        System.out.println( "Server terminated connection" );
    }

    // process problems communicating with server
    catch ( IOException ioException ) {
        ioException.printStackTrace();
    }
}
private void connectToServer() throws IOException
{
    genMsg.setText( "Attempting connection\n" );
    // create Socket to make connection to server
    client = new Socket(InetAddress.getByName( chatServer ), serverport );
    // display connection information
    genMsg.append( "Connected to: " +client.getInetAddress().getHostName() );
}

private void getStreams() throws IOException
{
    // set up output stream for objects
    output = new ObjectOutputStream(client.getOutputStream() );
    // flush output buffer to send header information
    output.flush();
}
private void handShake() throws IOException
{
    String message;
    String value[];
    value = new String [100];
    try {
    output.writeObject(Client_name);
    output.flush();
    input = new ObjectInputStream(client.getInputStream() );
    genMsg.append( "\n Client Name Send"  );
    message = (String) input.readObject();
    int i=0;
     while ( !message.equals( "." ) ){

        //genMsg.append("\n"+message );
        value[i++] =message; 
        message = (String) input.readObject();
    }
    userList.setListData(value);
    message = (String) input.readObject();
    genMsg.append("\n"+message );
    }
    // process problems sending object
    catch ( IOException ioException ) {
        genMsg.append( "\nError writing object" );
    }
     catch ( ClassNotFoundException classNotFoundException ) {
        System.out.println( "\nUnknown object type received" );
        }

}
public static void main( String args[] )    { 

    ClientChat application;
    application = new ClientChat( "127.0.0.1",5130,args[0] );
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
    application.runClient();
  }
 } 

The ServerChat code:

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

 public class ServerChat extends JFrame 
 {
private ObjectInputStream input;
private ObjectOutputStream output;
private JTextField enterField;
public static JTextArea displayArea;
private ServerSocket server;
private Socket connection;  
private ServerThread c1[];
//private Client Cname;
private static String clientList[];
private int counter = 0;

public ServerChat()
{
    super( "Server" );
    Container container = getContentPane();
    clientList = new String[100];
    // create enterField and register listener
    enterField = new JTextField();
    enterField.setEnabled( false );
    enterField.addActionListener(

    new ActionListener() {
        // send message to client
        public void actionPerformed( ActionEvent event )
        {
            //sendData( event.getActionCommand() );
        }
    } // end anonymous inner class
    ); // end call to addActionListener

    container.add( enterField, BorderLayout.NORTH );
    // create displayArea
    displayArea = new JTextArea();
    container.add( new JScrollPane( displayArea ), BorderLayout.CENTER );
    setSize( 300, 150 );
    setVisible( true );
}
public void runServer()
{
    // set up server to receive connections;
    // process connections
    try {
    // Step 1: Create a ServerSocket.
    server = new ServerSocket( 5130, 100);
    c1 = new ServerThread[100];
    while ( true ) {
        // Step 2: Wait for a connection.
        waitForConnection();
        handShake();
        displayArea.append("\nHanshake Complete");
        //c1[counter] = new ServerThread(connection,counter);   
        //c1[counter].start();
        ++counter;
        }
    }
    // process EOFException when client closes connection
    catch ( EOFException eofException ) {
    System.out.println( "Client terminated connection" );
    }
    // process problems with I/O
    catch ( IOException ioException ) {
    ioException.printStackTrace();
    }
}
private void waitForConnection() throws IOException
{
    displayArea.append( "\nWaiting for connection " );
    // allow server to accept a connection
    connection = server.accept();
    displayArea.append( "\nClient connected : Client");
}
private void handShake() throws IOException
{
    output = new ObjectOutputStream(connection.getOutputStream() );
    output.flush();
    String message;
    input = new ObjectInputStream(connection.getInputStream() );
    try {
        message = (String) input.readObject();
        clientList[counter]= message;
        displayArea.append( "\nClient connected : "+message);
        for (int i=0; i<=counter;i++ )
        {
            output.writeObject(clientList[i]);
            output.flush();
        }
        output.writeObject(".");
        output.flush();
        }
     // catch problems reading from client
    catch ( ClassNotFoundException classNotFoundException ) {
        System.out.println( "\nUnknown object type received" );
        }
        catch ( IOException ioException ) {
    ioException.printStackTrace();
    }
}
 public static void main( String args[] )
{
    ServerChat application = new ServerChat();
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
    application.runServer();
}
}

The ServerThread code:

import java.io.*;
 import java.net.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 public class ServerThread extends Thread 
 {
private Socket connection;
private ObjectOutputStream output;
private ObjectInputStream input;
private int counter;
public ServerThread(Socket con,int count)
{
    connection = con;
    counter = count;

}
public void run()
{
        try 
        {
            getStreams();
            processConnection();
        }
        // process EOFException when client closes connection
    catch ( EOFException eofException ) {
    System.out.println( "Client terminated connection" );
    }

    // process problems with I/O
    catch ( IOException ioException ) {
    ioException.printStackTrace();
    }
}
    private void getStreams() throws IOException
    {
    // set up output stream for objects
    output = new ObjectOutputStream(connection.getOutputStream() );
    // flush output buffer to send header information
    output.flush(); 
    output.writeObject( "SERVER>>> Connection successful");
    output.flush();
    }
private void processConnection() throws IOException
{
    // send connection successful message to client
    String message = "SERVER>>> Connection successful";

    output.writeObject( message );
    output.flush();
}
private void closeConnection() throws IOException
{
    ServerChat.displayArea.append( "\nUser terminated connection" );

    output.close();
    input.close();
    connection.close();
    }
 }
  • Ok, so your serverside code only send the user updates to the new connected client but not exsiting users. Also I don't see the code that notifying the list of its model change. – Saint May 19 '12 at 22:47

1 Answers1

2

you have real problem with Concurency in Swing, all output from BackGround Tasks must be wrapperd into invokeLater(), if you here awaiting possible and repeated networks fault(s) then better would be into invokeAndWait()

1) create only one method for add/appends String to the JTextArea

2) method add/appends String to the JTextArea wrap into invokeLater()

3) check this thread and amend/change all methods by given example

Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • @user863550, you can't invoke JList methods directly. You must invoke SwingUtilities.invokeLater(Runnable) and interact with the JList inside the Runnable. Read http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html completely and you'll understand. – Gili Aug 26 '11 at 00:33