我试图根据套接字编写聊天应用程序,但我有点困惑,如何实际停止我的服务器。
这是我的Server
构造函数
public Server(int port) {
this.port = port;
this.shutdown = false;
this.clientComponentSet = new HashSet<>();
LOGGER.info("Starting the server...\n");
dbConnection = new DBConnection();
dbConnection.establish();
if(dbConnection.isConnected()) {
LOGGER.info("Established connection with database\n");
} else {
LOGGER.warn("Can't establish connection with database\n");
}
machineString = new SimpleStringProperty();
addressString = new SimpleStringProperty();
portString = new SimpleStringProperty();
status = new SimpleStringProperty();
status.set("Offline");
}
然后转到run
方法
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
Platform.runLater(
() -> {
try {
machineString.set(serverSocket.getInetAddress().getLocalHost().getHostName());
addressString.set(serverSocket.getInetAddress().getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
LOGGER.error(e.toString());
}
portString.set(String.valueOf(this.port));
status.set("Online");
}
);
LOGGER.info("Server started\n");
while(!serverSocket.isClosed() && !shutdown) {
Socket clientSocket = serverSocket.accept();
ClientComponent clientComponent = new ClientComponent(this, clientSocket);
clientComponentSet.add(clientComponent);
clientComponent.start();
}
} catch (IOException e) {
LOGGER.error("Failed to start the server\n" + e.toString() + "\n");
}
}
和finnaly,应该停止/关闭服务器的方法
public void stopServer() {
try {
serverSocket.close();
shutdown = true;
LOGGER.info("Server stopped\n");
} catch (IOException e) {
LOGGER.error(e.toString());
}
}
虽然,它没有像我预期的那样工作。我启动然后停止我的服务器和日志是这样的:
2018-03-17 12:48:01 INFO启动服务器......
2018-03-17 12:48:02 INFO与数据库建立连接
2018-03-17 12:48:03 INFO Server已启动
2018-03-17 12:48:04 INFO Server已停止
2018-03-17 12:48:04错误无法启动服务器 java.net.SocketException:socket closed
现在尝试再次启动服务器,将抛出
线程中的异常&#34; JavaFX应用程序线程&#34; java.lang.IllegalThreadStateException
我如何才能停止/关闭我的服务器呢?
我实际上忘记了我的ServerController
课程
public class ServerController {
final static Logger LOGGER = Logger.getLogger(ServerController.class);
private ServerController(){
}
private static ServerController instance = null;
public static ServerController getInstance() {
if(instance == null) {
instance = new ServerController();
}
return instance;
}
private Server server;
public void start() {
server = new Server(Integer.parseInt(Property.getByKey("SERVER_PORT")));
server.start();
if(!server.isAlive()) {
LOGGER.info("Server closed\n");
}
}
}
答案 0 :(得分:0)
至少有一个令人困惑的事情是,即使调用了closeServer()
,你的错误仍会存在。
我建议;
shutdown
volatile
要重新启动线程,您需要创建一个新线程,在端口关闭后侦听端口,您需要创建一个新的ServerSocket。
BTW您不需要在日志末尾添加额外的新行。
答案 1 :(得分:0)
您收到&#34;服务器无法启动&#34;在等待建立连接时关闭ServerSocket的消息。 ServerSocket.accept方法将阻塞您的线程,直到它收到一些输入。我认为解决这个问题的最佳方法是发送一些&#34; shutdown&#34;当您希望终止服务器时发出信号。收到关闭信号/消息后,您可以安全地关闭ServerSocket并终止while循环。