首页 > 解决方案 > 如何在不使用 accept() 的情况下只等待带有 ServerSocket 的新 Socket?

问题描述

我有一个基本的服务器线程,我在其中接受带有 accept () 函数的套接字。在一段时间内,我需要避免连接新的套接字。我想通过告诉服务器线程不要建立新连接来从另一个线程执行此操作。

public class ServerThread extends Thread {
    private boolean running = false;

    private final ConnectionManager connectionManager;

    private final AtomicBoolean acceptNewConnections;

    ServerThread(ConnectionManager connectionManager, int port) {
        super("ServerThread");

        this.connectionManager = connectionManager;
        this.port = port;

        this.acceptNewConnections = new AtomicBoolean(false);
    }

    // This is called from other threads
    public void setAcceptNewConnections(boolean value) {
        acceptNewConnections.set(value);
    }

    @Override
    public void shutdown() {
        acceptNewConnections.set(false);

        running = false;

        try {
            join();
        } catch (InterruptedException ignored) {}
    }

    @Override
    public void run() {
        running = true;

        connectionManager.serverThreadStart();

        try (ServerSocket serverSocket = new ServerSocket(port)) {
            acceptNewConnections.set(true);

            while (running) {
                try {
                    if (acceptNewConnections.get()) {
                        final Socket socket = serverSocket.accept();
                        if (acceptNewConnections.get()) connectionManager.addClient(socket);
                        else socket.close();
                    } else {
                        try {Thread.sleep(10);} catch(InterruptedException e){}
                    }
                } catch (SocketTimeoutException ignored) {
                    //
                }
            }
        } catch (IOException e) {
            //
        }

        connectionManager.serverThreadStop();
    }
}

我的问题是:

有没有办法在等待时中断等待新套接字?

有没有办法等待一个新的套接字,但在等待它之后会根据需要接受它,而不是在一个命令中等待并接受它?

如何在不使用 Thread.sleep() 和无用的 cpu 过度使用的情况下在阻止新连接的同时暂停服务器线程?

非常感谢您的帮助。

标签: javamultithreadingsocketsserversocket

解决方案


推荐阅读