Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端服务器Java GUI:读/写导致程序冻结_Java_Swing_Client Server_Event Dispatch Thread - Fatal编程技术网

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

客户端服务器Java GUI:读/写导致程序冻结,java,swing,client-server,event-dispatch-thread,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 ser

我正在用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语句进行调试,然后我得到了一个“编写布尔值,等待fn/ln/un”的语句

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


谁能告诉我怎么解决这个问题吗?提前感谢您的帮助

我猜,
outToServer
没有被刷新。我猜(尽管我不能从您的示例代码中看出,
outToServer
是一个
DataOutputStream
。您需要调用
.flush
,将数据从缓冲区中取出并传输到线路上

试试这个:

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

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


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

谢谢!我重新构造了代码,使ActionListeners不包含客户机/服务器代码。如果您有时间,我还有一个与此相关的问题:当用户单击按钮时,我是否可以从该按钮的ActionListener向客户端/服务器线程发送信号,让它将fn/ln发送到服务器?如果这能让事情变得更清楚的话,我可以添加代码。@user3107593一般的答案是肯定的,但这是一个围绕监视器和同步块的复杂主题,在评论的范围内可能无法回答。相反,请通读关于的一般部分,如果你被卡住了,请发布另一个问题