gpt4 book ai didi

java - 聊天应用程序出错

转载 作者:行者123 更新时间:2023-12-02 05:36:12 25 4
gpt4 key购买 nike

我是java新手。我尝试制作聊天应用程序,但当我运行单个客户端时会出现一些错误。为什么文本区域和文本字段不显示。我得到的是这是由于 accept function 发生的。当编译器到达接受函数时,应用程序变得忙碌。即应用程序的屏幕没有显示任何内容。

客户端一代码:

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();
}
});
}

}

客户端二与客户端相同,只是服务器和客户端的端口不同。

客户端二代码

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();
}
});
}

}

最佳答案

您的 ServerSocket 代码在事件调度线程 (EDT) 上阻塞,等待服务器的响应,因此 GUI 无法重新绘制自身。您需要在单独的线程上执行该代码,以便 EDT 可以自由地重新绘制自身并响应用户事件。

阅读 Swing 教程中关于 Concurrency in Swing 的部分了解更多信息和示例。您可能会发现使用 SwingWorker 是一种简单的解决方案,因为它可以为您管理线程。

关于java - 聊天应用程序出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com