聊天 TCP 上的空白 Jframe 加载



我尝试编写聊天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 教程中的并发可能有助于理解详细信息。

最新更新