java - 聊天 TCP 上的空白 Jframe 加载

标签 java swing tcp

我试着写一个聊天 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 上执行代码。

Concurrency in Swing教程可能有助于理解细节。

关于java - 聊天 TCP 上的空白 Jframe 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531092/

相关文章:

java - 负向回顾 : How can I stop matches when the suffix is repeated?

Java Swing 重/慢 paintComponent - 有什么建议吗?

c - 文件部分用c发送

c++ - 与 telnet 客户端协商回显

javascript - 如何使用事件和 promise 来控制程序流?

java - 将 ArrayList 从 Activity 发送到 Fragment?

java - 如何在 netbeans 中为 GAE 配置 vosao cms

java - 获取方法 : One vs Many

java - JOptionPane 输入到 int

java - 确保 SpringLayout 不会缩小到一定大小以下