我试图创建一个界面来停止单击按钮。
当我在主服务器上运行服务器时,我收到: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();
}
答案 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);
}
_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());
}
}