客户端 - 服务器Java GUI:读/写导致程序冻结

时间:2013-12-16 20:04:45

标签: 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的按钮时,程序会在到达服务器等待fn / ln / username的位置时冻结。我添加了一堆用于调试的system.out语句,我得到了一个写“boolean,等待fn / ln / un”的语句。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我的猜测是outToServer没有被刷新。我猜(虽然我无法从您的示例代码中看出)outToServerDataOutputStream。您需要调用.flush将数据从缓冲区中取出并传输到线路上。

试试这个:

outToServer.writeUTF(usn.getText().trim());
outToServer.flush();