问题描述
我正在使用spring boot和angular,并且我有一个angular的方法,该方法调用spring boot来启动服务器。 服务器运行后,经过一段未定义的时间,我必须通过向Spring Boot发送一些请求来停止服务器的工作。 我该怎么做?服务器正在运行无限循环,它侦听客户端连接。 有没有一种方法可以发送一些虚假的客户端请求并说-嘿,客户端说“停止”,那么就停止吧?还是有类似的东西?
这是我的控制器方法:
@RequestMapping(value = "/server")
public void startServer() throws SQLException,IOException {
server.Server.server();
}
这是服务器:
public static void server() throws IOException {
ServerSocket ss = new ServerSocket(PORT);
Log.log("Server initialized on port " + PORT);
listRooms = new ArrayList<>();
Room room = new Room("Principal");
addRoom(room);
while (true) {
Socket socket = ss.accept();
Log.log("Established connection with " + socket.getInetAddress().getHostAddress());
new Thread(new User(socket,room)).start();
}
}
这将很快成为一个很好的客户,但还没有:
public static void client() throws IOException {
NetworkManager net;
net = NetworkManager.getInstance();
net.setServer("127.0.0.1",2014);
net.send("NICK " + "User");
new Thread(new Runnable() {
@Override
public void run() {
net.listenServer();
}
}).start();
}
欢迎任何建议!预先感谢!
解决方法
您可以使用下面的setSoTimeout()
函数来检查客户端是否已请求停止。
//Sample code
boolean stop_received=false; //Change this to true when stop request received
ss.setSoTimeout(3000); //Set timeout to 3 seconds
while (true) {
try{
Socket socket = ss.accept();
}
catch(java.net.SocketTimeoutException as e) //Timeout reached
{
if(stop_received==true) //Any stop request from client ?
{
ss.close(); //Yes. Close the server socket and exit while loop
break;
}
else{
continue; //No. Continue accepting
}
}
Log.log("Established connection with " + socket.getInetAddress().getHostAddress());
new Thread(new User(socket,room)).start();
}
有关更多详细信息,请参见this。