Java服务器使用Javafx停止按钮单击

时间:2020-05-21 19:09:26

标签: java javafx server client

我试图创建一个界面来停止单击按钮。 当我在主服务器上运行服务器时,我收到:Server-ul a pornit...,但没有任何界面。 我应该在Client类中实现用于停止服务器的接口吗? 我的服务器:

public class Server extends Application
{

    private final String _ip = "127.0.0.1";
    private final int _port = 9001;
    private ServerSocket _listener;
    private Socket _socket;
    private ObjectInputStream _input;

    Stage window;   
    Button button;

    public Server()
    {
        System.out.println("Server-ul a pornit...");

        try
        {
            _listener = new ServerSocket(_port);
            _socket = _listener.accept();
            _input = new ObjectInputStream(_socket.getInputStream());
        }
        catch (IOException ex)
        {
            System.out.println(ex.getMessage());
        }
    }

public void start()
    { ............}

我在JAVAfx接口的Server类中的方法:

 @Override
    public void start(Stage primaryStrage) {
        window=primaryStrage;
        window.setTitle("Close the server");
        button=new Button("Stop");
        button.setOnAction(e -> closeProgram());
        StackPane layoutPane=new StackPane();

        layoutPane.getChildren().add(button);
        Scene scene=new Scene(layoutPane,300,250);
        window.setScene(scene);
        window.show();


    }   

    private void closeProgram() {
        System.exit(0);
    }

主程序:

 public static void main(String[] args)
    {   
        Server s = new Server();
        s.start();


    }

1 个答案:

答案 0 :(得分:0)

首先必须通过在服务器类中添加stop方法来关闭服务器套接字:

public void stopServer(){
     _listener.close();  
}

我对您的服务器类为何扩展Application感到非常困惑。应该扩展应用程序的唯一一件事就是运行GUI的Class。此外,您将覆盖start方法。因此,如果两个启动方法都在同一个类中,则覆盖启动方法将覆盖现有类,因此您的服务器将不会启动。您可以从GUI重构服务器类,也可以保持不变。如果选择后者,则必须将服务器的启动方法重命名为serverStart()

您无需在主服务器中初始化服务器,而是在GUI的start方法方法中对其进行初始化:

    @Override
    public void start(Stage primaryStrage) {
        Server s = new Server();
        s.serverStart();
        window=primaryStrage;
        window.setTitle("Close the server");
        button=new Button("Stop");
        StackPane layoutPane=new StackPane();

        layoutPane.getChildren().add(button);
        Scene scene=new Scene(layoutPane,300,250);
        button.setOnAction(e -> {
             s.serverStop();
            Stage stage = scene.getWindow(); // if you also want to exit the application
            stage.close(); // otherwise remove it
           });
        window.setScene(scene);
        window.show();

    }

现在您的整个Server类应如下所示:

public class ServerTest extends Application {
        Stage window;   
        Button button;

    public class Server{
        private final String _ip = "127.0.0.1";
        private final int _port = 9001;
        private ServerSocket _listener;
        private Socket _socket;
        private ObjectInputStream _input;

        public Server(){
            System.out.println("Server-ul a pornit...");

            try
            {
                _listener = new ServerSocket(_port);
                _socket = _listener.accept();
                _input = new ObjectInputStream(_socket.getInputStream());
            }
            catch (IOException ex)
            {
                System.out.println(ex.getMessage());
            }
        }

       public void serverStart(){
        //DO server start stuff
        }
       public void stopServer(){
           _listener.close();  
        }
    }
    @Override
    public void start(Stage primaryStrage) {
        Server s = new Server();
        s.serverStart();
        window=primaryStrage;
        window.setTitle("Close the server");
        button=new Button("Stop");
        StackPane layoutPane=new StackPane();

        layoutPane.getChildren().add(button);
        Scene scene=new Scene(layoutPane,300,250);
        button.setOnAction(e -> {
             s.serverStop();
            Stage stage = scene.getWindow(); // if you also want to exit the application
            stage.close(); // otherwise remove it
           });
        window.setScene(scene);
        window.show();

    }

 public static void main(String[] args) {
            launch(args);
        }

一些注意事项:

  1. 您的构造函数不应真正启动服务器,而应使用它来初始化服务器参数,例如:_ip_port
public Server(String  ip, int port){
      this._ip = ip;
      this._port = posrt;
}

,您应该将服务器启动操作委托给serverStart方法:

public void serverStart(){
      try {
          _listener = new ServerSocket(_port);
          _socket = _listener.accept();
          _input = new ObjectInputStream(_socket.getInputStream());
      }
      catch (IOException ex) {
          System.out.println(ex.getMessage());
      }
}
  1. 理想情况下,您应该在单独的类中重构逻辑代码,而不是将其直接包含在GUI类中。