Error In Chat App(聊天应用程序中的错误)
问题描述
我是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.
这篇关于聊天应用程序中的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:聊天应用程序中的错误


- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01