我使用JavaFX创建了一个客户端/服务器聊天应用程序。当按下“启动服务器”按钮时,我的ServerController将创建一个运行在单独线程上的Server对象。
这里是我的问题:
每当我只是用默认的“x”按钮关闭窗口时,服务器线程就会终止,但不会通知活动客户端服务器已关闭。我需要像使用“停止服务器”按钮一样向客户端通知服务器已关闭。我的服务器保存有控制器对象的引用。
这是我的“停止服务器”按钮,它通知所有客户端服务器将关闭,然后关闭所有套接字以及相关内容。
我应该如何让“x”按钮与我的“停止服务器”按钮执行同样的操作?
这里是我的问题:
每当我只是用默认的“x”按钮关闭窗口时,服务器线程就会终止,但不会通知活动客户端服务器已关闭。我需要像使用“停止服务器”按钮一样向客户端通知服务器已关闭。我的服务器保存有控制器对象的引用。
public class ServerController {
@FXML
TextArea chatEvent_txt;
@FXML
Button start_btn;
@FXML
Button stop_btn;
private Server server;
private boolean started = false;
private StringBuffer chatEvents = new StringBuffer("");
/**
* @param e
*/
@FXML
public void startButtonAction(ActionEvent e) {
if (!started) {
this.server = new Server(this);
new Thread(server).start();
started = true;
chatEvents = chatEvents.append("Server started.." + "\n");
chatEvent_txt.setText(chatEvents.toString());
} else {
chatEvent_txt.setText("Server already started\n");
}
}
这是我的“停止服务器”按钮,它通知所有客户端服务器将关闭,然后关闭所有套接字以及相关内容。
@FXML
public void stopButtonAction(ActionEvent e) {
if (started) {
server.setRunning(false);
chatEvent_txt.setText("Server wurde gestoppt\n");
started = false;
}
}
方法setRunning()只会将一个变量设置为false,使得线程离开接受新客户端的while循环。当while循环结束后,服务器将向所有客户端发送一条消息,以便他们知道服务器将被关闭。
我的服务器上的run方法:
@Override
public void run() {
try {
serverSocket.setSoTimeout(500);
while (running) {
try {
clientSocket = serverSocket.accept();
new Thread(new Listener(clientSocket, this)).start();
} catch (IOException e) {
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
try {
broadcastMessage(new Message(Message.Type.DISCONNECT_OK, "Server"));
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我应该如何让“x”按钮与我的“停止服务器”按钮执行同样的操作?