Client-Server Java GUI: read/write causing program

2019-03-02 08:31发布

问题:

I'm doing a client/server program in Java (including a GUI). I've got the following code in the client:

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();
     }

  }

}

And the following code in the Server:

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();

But when the button that calls SBListener is clicked, the program freezes when it gets to the point where the Server is waiting for fn/ln/username. I added a bunch of system.out statements for debugging and I get up to the one that says "wrote boolean, waiting for fn/ln/un".

Basically, I'm trying to update the screen after the Server returns a false value. Specifically, I want to add two text fields for first & last name. I then want to send those values to the server.

Can anyone tell me how to fix this? Thanks in advance for any help!

回答1:

Don't execute client/server code in an ActionListener. This will cause the Event Dispatch Thread to block while waiting for a response from the server. When EDT is blocked the whole GUI freezes.

Read the section from the Swing tutorial on Concurrency for more information. You need so use a separate Thread for the client/server code. Or you can use a SwingWorker as discussed in the tutorial.



回答2:

My guess is that outToServer isn't being flushed. I would guess (although I can't tell from your sample code) that outToServer is a DataOutputStream. You need to call .flush to get the data out of the buffer and onto the wire.

Try this:

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