如何断开任何仍在连接的客户端并关闭服务器?

How to disconnect any clients still connected and close the server?

提问人:Melany 提问时间:6/13/2022 最后编辑:Melany 更新时间:6/13/2022 访问量:420

问:

我必须实现(在服务器端)quit 命令,该命令断开任何仍连接的客户端并关闭服务器。

这里是服务器代码。

public class Server {
    
    public static void main (String args []) {
        if (args.length < 1) {
            System.err.println("Usage: java Server <port>");
            return;
        }
        int port = Integer.parseInt(args[0]);

        try {
            ServerSocket listener = new ServerSocket(port);
            Files input = new Files();
            
            while (true) {
                System.out.println("Listening...");
                Socket s = listener.accept();
                System.out.println("Connected");

                Thread clientHandlerThread = new Thread(new ClientHandler(s,input));
                clientHandlerThread.start();
            }
        } catch (IOException e) {
            System.err.println("Error during I/O operation:");
            e.printStackTrace();
        }
    }
}

服务器在运行时如何接受命令行指令?

Java 多线程 服务器端

评论

1赞 queeg 6/13/2022
是什么阻止你只是调用?它将终止服务器进程,这会导致所有套接字关闭,并且客户端将收到其对等体终止连接的通知。System.exit()

答:

0赞 zaerymoghaddam 6/13/2022 #1

首先,你必须通过将客户端的实例放在一个列表中来跟踪你创建的所有客户端,这样当你要关闭所有内容时,你可以访问它们并告诉他们完成他们的工作。

关于如何告诉线程实例这样做,您应该调用它们的方法以通知它们应该完成/停止它正在执行的任何操作。在线程上调用该方法会导致您应该处理的线程并优雅地完成您正在执行的任何事情。interrup()interrupt()InterruptedException

例如,如果你的 run 方法中有这样的东西:ClientHandler

while (true) {
    try {
        Thread.sleep(interval);
    } catch (InterruptedException e){
        Thread.currentThread().interrupt();
        System.out.println(
                "We've been asked to finish up the communication. Bye! ;)");
    }
    // do your business
}

当然,这是一个非常简化的场景,用于演示整体方法。您应该能够在网上找到大量有关如何使用中断的教程。