2016-08-31 3 views
0

Hallo, ich habe ein Problem mit Socket mit Javafx-Anwendung.Socket-Kommunikation zwischen javafx

Client-Code

@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); 
       } 
    } 

Der obige Code starten Sie den Socket-Server, wenn die Schaltfläche geklickt.

Servercode

@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(); 
     } 
    } 

} 

Above Code-Client auf andere JavaFX-Anwendung erstellen. Das Problem ist, wenn die Client-Anwendung gestartet wird, wird es nicht die Benutzeroberfläche anzeigen, ich denke, es wird warten, bis der Server eine Verbindung herstellt. Wenn die Server-Anwendung gestartet wird, sobald der Client angezeigt wird.Wie soll ich dieses Problem lösen?

+0

Ist es nicht gut, wenn Sie wie Loder oder Waiting Bild auf UI mit Display-Meldung "Bitte warten, bis der Server eine Verbindung herstellen"? –

+0

Sie sollten einen separaten Thread erstellen, um die Netzwerkkommunikation vom Server zu ermöglichen. Sie sollten dies nicht im Hauptthread der Benutzeroberfläche tun! –

+2

scheinen die Server- und Client-Teile invers zu sein. –

Antwort

1

JavaFX hat einen eigenen Thread, auf dem es läuft, und behandelt die GUI. Wenn Sie blockierende Aufgaben für diesen Thread ausführen, wird die GUI blockiert. Eine Sache, die Sie tun können, ist in Ihrem Button-Handler, feuern Sie einen neuen Thread ab.

Ich hoffe, Sie können sehen, das ist ein schlechtes Design, weil Sie mehrere gestartete Threads ansammeln können.

Vielleicht überprüfen Sie etwas wie diese JavaFX SwingWorker Equivalent? für ein vollständigeres Beispiel.

Verwandte Themen