2016-08-31 19 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(); 
     } 
    } 

} 

다른 자바 FX 애플리케이션에 클라이언트를 생성합니다. 문제는 클라이언트 응용 프로그램을 시작할 때 UI가 표시되지 않는다는 것입니다. 서버 연결을 기다리는 것 같습니다. 서버 응용 프로그램이 곧 시작되면 클라이언트 ui가 나타납니다.이 문제를 해결하는 방법.

+0

"서버에 연결할 때까지 기다려주십시오"라는 메시지와 함께 UI에 Loder 또는 Waiting 이미지를 넣으면 좋지 않습니까? –

+0

서버와의 네트워크 통신을 허용하려면 별도의 스레드를 만들어야합니다. UI의 기본 스레드에서 수행해서는 안됩니다. –

+2

당신은 서버와 클라이언트 부분이 반대로되어있는 것 같습니다. –

답변

1

JavaFX는 자체 스레드로 실행되며 GUI를 처리합니다. 해당 스레드에서 차단 작업을 수행하면 GUI가 차단됩니다. 한 가지 할 수있는 일은 버튼 처리기에 있으며 새 스레드를 시작합니다.

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

여러 개의 시작된 스레드가 누적 될 수 있으므로 좋지 않은 디자인이라고 생각합니다.

좀 더 자세한 예를 보려면 JavaFX SwingWorker Equivalent?을 확인하십시오.