java - 客户端-服务器 Java GUI : read/write causing program to freeze

标签 java swing client-server event-dispatch-thread

我正在用 Java(包括 GUI)编写客户端/服务器程序。 我在客户端中有以下代码:

public class SBListener implements ActionListener{
  public void actionPerformed(ActionEvent e){
     try{
        outToServer.writeUTF(usn.getText().trim());
        System.out.println("sent username to server");
        playerExists = inToClient.readBoolean();
        System.out.println("past getting player");
        System.out.println("player exists = " + playerExists);
     }catch(IOException a){
        System.err.println(a);
     }
     if(playerExists == false){
        JButton submitInfo = new JButton("submit info");
        submitInfo.addActionListener(new SBNewInfoListener());
        init.add(new JLabel(""));//dummy element to get the right alignment
        init.add(new JLabel("First Name:"));
        init.add(fn);
        init.add(new JLabel("Last Name:"));
        init.add(ln);
        init.add(submitInfo);
        add(init, BorderLayout.WEST);
        init.setVisible(true);
        init.revalidate();
        init.repaint();
     }

  }

以及服务器中的以下代码:

String username = inp.readUTF();
System.out.println(username);
out.writeBoolean(false);

System.out.println("wrote boolean, waiting for fn/ln/un");
fn = inp.readUTF();
System.out.println("got fn");
ln = inp.readUTF();
un = inp.readUTF();

但是当调用 SBListener 的按钮被点击时,程序在到达 Server 正在等待 fn/ln/username 的点时卡住。我添加了一堆用于调试的 system.out 语句,然后我开始写“写 boolean 值,等待 fn/ln/un”。

基本上,我试图在服务器返回错误值后更新屏幕。具体来说,我想为名字和姓氏添加两个文本字段。然后我想将这些值发送到服务器。

谁能告诉我如何解决这个问题?在此先感谢您的帮助!

最佳答案

不要在 ActionListener 中执行客户端/服务器代码。这将导致事件调度线程在等待服务器响应时阻塞。当 EDT 被阻止时,整个 GUI 会卡住。

阅读 Concurrency 上的 Swing 教程部分了解更多信息。您需要为客户端/服务器代码使用单独的线程。或者您可以使用教程中讨论的 SwingWorker

关于java - 客户端-服务器 Java GUI : read/write causing program to freeze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619873/

相关文章:

java - PsiTreeUtil.getParentOfType() 返回 null

java - 如何添加或更改 JMenuItem 上的标签?

java - KeyListener 和 MouseListener 不工作

java - 从 JTable 中删除对象时出现 ArrayOutOfBoundsException

.net - 调查从服务器通知 WPF 客户端的解决方案

java - LocalDate 字段验证不适用于 DTO

java - 我应该如何对与数据库对话的 java 脚本进行多线程处理

java - 在运行时在 netbeans 中创建组件

c - 来自同一客户端的多个连接

java - C服务器和Java客户端之间的UDP连接