Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拒绝新连接而不关闭当前连接_Java_Serversocket - Fatal编程技术网

Java 拒绝新连接而不关闭当前连接

Java 拒绝新连接而不关闭当前连接,java,serversocket,Java,Serversocket,我有一个守护进程,它被设计来接受来自现场设备的连接——它们使用命令/响应进行一些自定义通信 每次设备连接到端口时,我们都会生成一个线程来处理该通信。当通信结束时,每个线程都会自行停止并被破坏。通信可能持续几秒钟到几分钟。这些线程的繁殖是在一个永无止境的while循环中完成的,该循环创建了我们线程类的一个新实例,该实例在等待接受()到端口的连接时阻塞。当建立了一个连接时,线程繁殖了,循环返回开始另一个线程繁殖和接受() 当可能同时连接的数量相对较少时,这是可以接受的——但我们现在有成千上万的设备,

我有一个守护进程,它被设计来接受来自现场设备的连接——它们使用命令/响应进行一些自定义通信

每次设备连接到端口时,我们都会生成一个线程来处理该通信。当通信结束时,每个线程都会自行停止并被破坏。通信可能持续几秒钟到几分钟。这些线程的繁殖是在一个永无止境的while循环中完成的,该循环创建了我们线程类的一个新实例,该实例在等待接受()到端口的连接时阻塞。当建立了一个连接时,线程繁殖了,循环返回开始另一个线程繁殖和接受()

当可能同时连接的数量相对较少时,这是可以接受的——但我们现在有成千上万的设备,它们可能都在试图同时通信(最坏的情况是肯定的,但仍然有可能)

我们希望在传递Thread.activeCount()的某个值后拒绝新的连接——从外部的角度来看,尝试打开套接字连接只会失败,因为端口未打开,连接被拒绝

下面的代码是一个高度简化的代码片段,我希望它能起作用,但实际发生的是,我们仍然接受来自外部的新连接,它们只是在activeCount下降并将连接传递给新线程之前不会连接到线程

while (1)
{
    if (Thread.activeCount() < maxThreads)
    {
        new MyCustomThread(serverSocket.accept(), dataSource).start();
    }
}
while(1)
{
if(Thread.activeCount()

当我的activeCount超过某个值时,是否有某种方法可以暂时关闭端口,从而拒绝新连接,而不终止任何正在进行的连接?

在我看来,您似乎需要一个固定的线程池。我建议您使用Java中的“Executor Service”。在当前的用例中,这将对您有所帮助。@我想问题的关键不是让客户端等待连接建立或进入任何队列,而是强迫他们无法连接。解决方案可能是接受连接,然后检查MyCustomThread中是否达到了限制,如果为true,则关闭给定的套接字,不进行任何处理。serverSocket.accept().close();