Java中的套接字连接不受限制

Java中的套接字连接不受限制,java,sockets,Java,Sockets,我对Java和sockets还是新手。我有一个监听连接的程序,如果有连接,它会将其发送到处理连接的类,并使用ExecutorService启动处理线程 我想限制连接的数量,所以我发现套接字有一个参数。这是主要代码: public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(123, 1); try {

我对Java和sockets还是新手。我有一个监听连接的程序,如果有连接,它会将其发送到处理连接的类,并使用
ExecutorService
启动处理线程

我想限制连接的数量,所以我发现套接字有一个参数。这是主要代码:

public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(123, 1);
        try {
            ConnectionListener listener = new ConnectionListener(server);
            listener.run();
        }
        catch (Exception exception) {
            exception.printStackTrace();
        }
    }
在本例中,我想将连接限制为1。 我试图用大量并行执行的python脚本来轰炸它,该脚本将数据发送到此端口。但我从未收到“连接被拒绝”或明显的连接延迟,就好像没有遵守限制一样


我做错了什么?

您可以在接受一个连接后关闭服务器套接字。这对您很有用。


为了更深入地了解这个问题,您可以参考answer()

backlog
参数并不限制您的程序将拥有的连接数量

backlog参数处理服务器可以维护的不可接受的连接数。如果您有1个待办事项,并且有一个客户端连接到服务器,那么接受第一个连接将允许接受其他连接。但是,如果您不接受第一次连接,任何将来连接到服务器的客户端都将被拒绝

积压的2将支持两个不可接受的连接,并拒绝第三个连接


此行为可能因平台而异。有关更多信息,请查看

回答该问题的用户是网络领域的专业人士,如果您有兴趣,可以进一步了解Java†中与服务器套接字相关的问答



†虽然并非所有这些帖子都与服务器套接字直接相关(由于标签策略不佳,有些帖子可能根本不相关),但我强烈建议您在空闲时间查看这些帖子-您可能会学到一些有助于解决未来问题的东西。

这是否回答了您的问题?不是真的。首先,因为我可能不理解它,但它说在Unix中我应该得到一个“拒绝连接”。我在虚拟机中的Linux上运行,而Java程序在Windows主机上运行。但是由于发送脚本是在Linux上的,我希望从这个答案中得到一个“连接被拒绝”。我不相信
backlog
会阻止多个连接,而是会创建一个不被接受的连接队列。客户端2未被拒绝的原因可能是客户端2发出请求时客户端1已被接受。我自己没有使用过
backlog
参数(从未使用过),但根据我在网上读到的内容,情况似乎是这样的。试试看:让客户端1发出请求,不要接受客户端1服务器端的请求。连接客户端2,查看它是否被拒绝。设法跳到计算机上测试它。似乎这是对的:
backlog
创建了一个不可接受的连接队列。您的第二个客户端没有被拒绝,因为您的第一个客户端已被接受,因此积压未满,因此第二个客户端未被拒绝。因此,这甚至不是为了限制已接受的连接?这就可以解释了。你能把这个写下来作为答案吗,然后我可以把它标记为已解决。是的,我当然可以手工做一些事情,但我认为我应该使用已经实现的东西。至于链接,这就是我的意思。由于Windows发布了第一个问题,我应该得到一个拒绝的连接,但我没有。我想上面的评论已经回答了这个问题。但无论如何,在套接字调用被接受的时间间隔内(通过accept()方法调用),传入的客户端连接请求存储在由操作系统(在您的案例中是windows)维护的队列中。后续对accept()的调用会从队列中删除请求,如果没有等待的客户端,则会阻止请求。“backlog”参数控制此队列的长度。当客户端请求连接且队列已满时,请求将因ConnectionException而失败。否则,如果后续调用添加到队列中,请求将被添加到队列中。或者根据平台的不同,请求将超时。而backlog参数只是一个提示。系统可以向上或向下调整:请参阅。