javafx之间的套接字通信

javafx之间的套接字通信,java,sockets,javafx-8,serversocket,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("

嗨,我在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();
        }
    }

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

服务器代码

@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将立即显示。如何解决此问题

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

new Thread(()->{onSetupGameClick();}).start();
我希望您能看到这是一个糟糕的设计,因为您可以累积多个启动线程


也许可以查看类似的内容以获得更完整的示例。

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

new Thread(()->{onSetupGameClick();}).start();
我希望您能看到这是一个糟糕的设计,因为您可以累积多个启动线程


也许可以查看类似的内容以获得更完整的示例。

如果您在UI上放置like Loder或Waiting image,并显示消息“请等待服务器连接”,这不是很好吗?您应该创建一个单独的线程以允许从服务器进行网络通信,而不应该在UI的主线程中执行此操作!您的服务器和客户端部分似乎颠倒了。如何分离网络线程。@ScaryWombat抱歉,将标题放错了位置。如果您在UI上放置“请等待服务器连接”之类的图像,并显示消息“请等待服务器连接”,这不是很好吗?您应该创建一个单独的线程,以允许从服务器进行网络通信,你不应该在UI的主线程中这样做!您的服务器和客户端部分似乎颠倒了。如何分离网络线程。@ScaryWombat抱歉,标题放错了位置