2016-08-31 17 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が表示されない場合、サーバーが接続するのを待つと思います。サーバーアプリケーションがすぐに起動したときに、クライアントuiが表示されます。この問題を解決する方法。

+0

「Loder」や「Waiting」のような画像をUIに表示すると、「サーバが接続するのをお待ちください」というメッセージが表示されます。 –

+0

サーバーからのネットワーク通信を可能にするために別のスレッドを作成する必要があります。UIのメインスレッドでは実行しないでください。 –

+2

あなたはサーバーとクライアントの部分を逆にしているようです。 –

答えて

1

JavaFXには、それが実行される独自のスレッドがあり、GUIを処理します。そのスレッドでブロックするタスクを実行すると、GUIがブロックされます。あなたができることの1つは、ボタンハンドラにあり、新しいスレッドを起動します。

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

私はあなたが複数の開始スレッドを蓄積することができるので、これは悪いデザインであることがわかりましたか?

さらに詳しい例についてはJavaFX SwingWorker Equivalent?のようなものをチェックしてください。

関連する問題