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

我正在用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值后尝试更新屏幕。 具体来说,我想为名字和姓氏添加两个文本字段。 然后我想将这些值发送到服务器。

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

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

有关更多信息,请阅读Swing教程中的并发部分。 您需要为客户端/服务器代码使用单独的Thread。 或者您可以使用本教程中讨论的SwingWorker

我的猜测是outToServer没有被刷新。 我猜(虽然我无法从您的示例代码中outToServeroutToServer是一个DataOutputStream 。 您需要调用.flush来将数据从缓冲区中取出并放到线路上。

尝试这个:

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