如何在Java Spring Boot中停止服务器套接字

问题描述

我正在使用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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...