@Override
    public void stop() {
        if (!isRunning()) return;

        // 父类的stop放在最前面，如果其他线程检查运行标志停止就会
        super.stop();

        // 关闭监听套接字，如果正在监听中，会引起监听线程异常，然后退出
        try {
            if (serverSocket != null) serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 如果正在等待读取数据，关闭客户端套接字，客户数据读取线程就会退出
        listClientSocket.forEach((x, y) -> {
            try {
                if (y != null) y.socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(x + " socket has closed manually!");
        });
        listClientSocket.clear();
        serverSocket = null;

        // 等待线程都退出
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Service has stopped!");
    }