聊天应用程序中的错误
我是java新手.我试图制作聊天应用程序,但是当我运行单个客户端时会出现一些错误.为什么文本区域和文本字段不显示.我得到的是由于 accept function 而发生这种情况.当编译器到达接受函数时,应用程序变得忙碌.即应用程序的屏幕什么都不显示.
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.
客户一号代码:
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() +"
" +"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.
客户端二代码
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() +"
" +"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();
}
});
}
}
推荐答案
您的 ServerSocket 代码在等待来自服务器的响应的事件调度线程 (EDT) 上阻塞,因此 GUI 无法重新绘制自身.您需要在单独的线程上执行该代码,以便 EDT 可以自由地重新绘制自身并响应用户事件.
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.
阅读关于 Swing 中的并发 了解更多信息和示例.您可能会发现使用 SwingWorker
是一种简单的解决方案,因为它会为您管理线程.
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.
相关文章