我尝试编写聊天TCP。 如果我独立运行文件服务器和客户端,那没关系。但是如果我使用其他jframe运行,它有主机按钮来运行服务器,它将显示一个空白的jframe
{
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
FrmServer f=new FrmServer();
f.setVisible(true);
}
}
这是 FrmServer
public FrmServer() throws HeadlessException {
setTitle("Server");
setLayout(new BorderLayout());
addContent();
addSend();
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chat();
}
private ServerSocket serverInfo;
private Socket clientInfo;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private void chat() {
try {
serverInfo = new ServerSocket(12345);
clientInfo = serverInfo.accept();
ois = new ObjectInputStream(clientInfo.getInputStream());
oos = new ObjectOutputStream(clientInfo.getOutputStream());
while (true) {
String data = ois.readObject().toString();
txtContent.append("Client :" + data + "n");
}
} catch (Exception ex) {
}
}
以下是使用新线程的修改代码(尽管未尝试(:
public FrmServer() throws HeadlessException {
setTitle("Server");
setLayout(new BorderLayout());
addContent();
addSend();
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chat();
}
private ServerSocket serverInfo;
private Socket clientInfo;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private void chat() {
Runnable runnable = new Runnable() {
public void run() {
try {
serverInfo = new ServerSocket(12345);
clientInfo = serverInfo.accept();
ois = new ObjectInputStream(clientInfo.getInputStream());
oos = new ObjectOutputStream(clientInfo.getOutputStream());
while (true) {
String data = ois.readObject().toString();
SwingUtilities.invokeLater(new Runnable() {
public void run(){
txtContent.append("Client :" + data + "n");
}
});
}
} catch (Exception ex) {
}
}
};
//You can use a ThreadPool too.
new Thread(runnable).start();
}
使用 Java 8,您可以改进语法。
重要的是,您不应该在 Swing/AWT 事件调度线程上做任何耗时的事情。连接到服务器,等待回复肯定很耗时。尽管问题是,但您无法从其他线程更新 UI。因此,您需要 SwingUtilities
类来执行 EDT 上的代码。
Swing 教程中的并发可能有助于理解详细信息。