2016-08-31 79 views
0

嗨,我在使用javafx应用程序套接字时遇到了麻烦。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,我认为它会等待服务器连接。当服务器应用程序尽快启动时,客户端用户界面将显示出来。如何解决此问题。

+0

如果您在显示消息“请等待服务器连接”的UI上放置Loder或Waiting图像,这不是一件好事吗? –

+0

您应该创建一个单独的线程以允许来自服务器的网络通信,您不应该在UI的主线程中执行此操作! –

+2

你似乎有反转的服务器和客户端部分。 –

回答

1

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

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

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

也许可以查看类似JavaFX SwingWorker Equivalent?的更完整示例。