javafx之间的套接字通信

时间:2016-08-31 05:24:30

标签: java sockets javafx-8 serversocket

嗨,我在使用带有javafx应用程序的套接字时遇到了麻烦。

客户代码

@FXML
    private void onSetupGameClick() {
        try{    
            Socket s=new Socket("localhost",6666);

            DataOutputStream dout=new DataOutputStream(s.getOutputStream());

            dout.writeUTF("Hello Server");
            dout.flush();

            dout.close();
            s.close();

            }catch(Exception e){
                System.out.println(e);
                }
    }

上面的代码在单击按钮时启动套接字服务器。

服务器代码

@Component
public class WelcomeController implements BootInitializable {

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {

        try {
            ServerSocket ss=new ServerSocket(6666);
            Socket s=ss.accept();//establishes connection 

            DataInputStream dis=new DataInputStream(s.getInputStream());

            String  str=(String)dis.readUTF();
            System.out.println("message= "+str);
            lblGame.setText(str);

            ss.close();
            System.out.println("Connection created");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

上面的代码将在其他javafx应用程序上创建客户端。 问题是,当客户端应用程序启动时它不会显示UI,我认为它将等待服务器连接。当服务器应用程序启动后,客户端ui将立即出现。如何解决此问题。

1 个答案:

答案 0 :(得分:2)

JavaFX拥有它运行的自己的线程,并处理gui。当你在该线程上执行阻塞任务时,它将阻止gui。你能做的一件事就是在你的按钮处理程序中,启动一个新线程。

new Thread(()->{onSetupGameClick();}).start();

我希望你能看到这是一个糟糕的设计,因为你可以积累多个启动的线程。

也许请查看类似JavaFX SwingWorker Equivalent?的内容,以获得更完整的示例。