Error In Chat App [closed]

2020-05-09 06:31发布

I am newbie to java. I tried to make chat app but some error occur when i run even single client .Why the Text Area and Text Field does not show. What i get is this occurs due to accept function .When compiler reaches to accept function the app become busy. i.e the screen of app show nothing.

Code Of Client One:

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

public class ChatAppOne{

JFrame jframe;
JTextArea jtextarea;
JTextField jtextfield;
JButton jbutton;

ServerSocket server;
Socket sSocket,cSocket;
InputStream inStream;
ObjectInputStream objInStream;
OutputStream outStream;
ObjectOutputStream objOutStream;


ChatAppOne(){
    jframe=new JFrame();
    jframe.setLayout(new FlowLayout(FlowLayout.LEFT));

    jtextarea=new JTextArea("",28,49);
    jtextarea.setEditable(false);
    jframe.add(new JScrollPane(jtextarea));

    jtextfield=new JTextField();
    jtextfield.setPreferredSize(new Dimension(440,30));
    jframe.add(jtextfield);

    jbutton=new JButton("Send");
    jbutton.setPreferredSize(new Dimension(100,35));
    jframe.add(jbutton);

    jbutton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
            try{
                cSocket=new Socket("localhost",1340);
                outStream=cSocket.getOutputStream();
                objOutStream=new ObjectOutputStream(outStream);

                objOutStream.writeObject(jtextfield.getText());
                jtextarea.setText(jtextarea.getText() +" \n " +"Me: " +jtextfield.getText());

                jtextfield.setText("");

                cSocket.close();
                outStream.close();
                objOutStream.close();
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
            }
        }
    });

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setSize(600,600);
    jframe.setTitle("Chat Application");
    jframe.setVisible(true);

    startServer();
}

void startServer(){
    try{
        server=new ServerSocket(1550);
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
    }
    while(true){
        try{
            sSocket=server.accept();

            inStream=sSocket.getInputStream();
            objInStream=new ObjectInputStream(inStream);

            String msg=(String) objInStream.readObject();

            jtextarea.setText("App Two : "+ msg);

            sSocket.close();
            inStream.close();
            objInStream.close();

        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
        }
    }
}


public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            new ChatAppOne();
        }
    });
}

}

Client Two is same as Client except port difference in server and client.

Code Of Client Two

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

public class ChatAppTwo{

JFrame jframe;
JTextArea jtextarea;
JTextField jtextfield;
JButton jbutton;

ServerSocket server;
Socket sSocket,cSocket;
InputStream inStream;
ObjectInputStream objInStream;
OutputStream outStream;
ObjectOutputStream objOutStream;


ChatAppTwo(){
    jframe=new JFrame();
    jframe.setLayout(new FlowLayout(FlowLayout.LEFT));

    jtextarea=new JTextArea("",28,49);
    jtextarea.setEditable(false);
    jframe.add(new JScrollPane(jtextarea));

    jtextfield=new JTextField();
    jtextfield.setPreferredSize(new Dimension(440,30));
    jframe.add(jtextfield);

    jbutton=new JButton("Send");
    jbutton.setPreferredSize(new Dimension(100,35));
    jframe.add(jbutton);

    jbutton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
            try{
                cSocket=new Socket("localhost",1550);
                outStream=cSocket.getOutputStream();
                objOutStream=new ObjectOutputStream(outStream);

                objOutStream.writeObject(jtextfield.getText());
                jtextarea.setText(jtextarea.getText() +" \n " +"Me: " +jtextfield.getText());

                jtextfield.setText("");

                cSocket.close();
                outStream.close();
                objOutStream.close();
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
            }
        }
    });

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setSize(600,600);
    jframe.setTitle("Chat Application");
    jframe.setVisible(true);

    startServer();
}

void startServer(){
    try{
        server=new ServerSocket(1340);
        JOptionPane.showMessageDialog(null, "Server Started", "Error", JOptionPane.PLAIN_MESSAGE);
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
    }
    while(true){
        try{
            sSocket=server.accept();
            inStream=sSocket.getInputStream();

            objInStream=new ObjectInputStream(inStream);
            String msg=(String) objInStream.readObject();

            jtextarea.setText("App Two : "+ msg);

            sSocket.close();
            inStream.close();
            objInStream.close();

        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.PLAIN_MESSAGE);
        }
    }
}


public static void main(String args[]){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            new ChatAppTwo();
        }
    });
}

}

1条回答
Ridiculous、
2楼-- · 2020-05-09 07:30

Your ServerSocket code is blocking on the Event Dispatch Thread (EDT) waiting for a response from the server so the GUI can't repaint itself. You need to execute that code on a separate Thread so the EDT if free to repaint itself and respond to user events.

Read the section from the Swing tutorial on Concurrency in Swing for more information and examples. You may find using a SwingWorker the easy solution as it manages the Thread for you.

查看更多
登录 后发表回答