Связь через сокет между 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. Проблема в том, что когда клиентское приложение запускается, оно не отображает пользовательский интерфейс, я думаю, что оно будет ждать подключения сервера. Когда серверное приложение запустится, как только появится клиентский пользовательский интерфейс. Как решить эту проблему.


person boycod3    schedule 31.08.2016    source источник
comment
Разве это не хорошо, если вы поместите изображение Loder или Ожидание в пользовательский интерфейс с отображаемым сообщением Пожалуйста, подождите, пока сервер подключится?   -  person Jekin Kalariya    schedule 31.08.2016
comment
Вы должны создать отдельный поток, чтобы разрешить сетевое взаимодействие с сервером, вы не должны делать это в основном потоке пользовательского интерфейса!   -  person Am_I_Helpful    schedule 31.08.2016
comment
у вас похоже серверная и клиентская части поменяны местами.   -  person Scary Wombat    schedule 31.08.2016
comment
Как отделить сетевой поток.   -  person boycod3    schedule 31.08.2016
comment
@ScaryWombat, извините, заголовок не к месту.   -  person boycod3    schedule 31.08.2016


Ответы (1)


JavaFX имеет собственный поток, в котором он работает, и обрабатывает графический интерфейс. Когда вы выполняете блокирующие задачи в этом потоке, он блокирует графический интерфейс. Одна вещь, которую вы можете сделать, это запустить новый поток в вашем обработчике кнопок.

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

Я надеюсь, вы видите, что это плохой дизайн, потому что вы можете накапливать несколько запущенных потоков.

Возможно, посмотрите что-то вроде этого JavaFX SwingWorker Equivalent? для более полного примера.

person matt    schedule 31.08.2016