2016-08-31 130 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?的更完整示例。