【问题标题】:Socket connections in Java are not limiting [duplicate]Java中的套接字连接不受限制[重复]
【发布时间】:2020-01-15 13:01:00
【问题描述】:

我还是 Java 和套接字的新手。我有一个监听连接的程序,如果有连接,它会将其发送到处理连接的类并使用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 脚本来轰炸它。但我从来没有收到“连接被拒绝”或连接明显延迟,好像没有遵守限制一样。

我做错了什么?

【问题讨论】:

  • 并非如此。首先,因为我可能不理解它,而且它说在 Unix 中我应该得到一个“连接被拒绝”。我在虚拟机中的 Linux 上运行,而 Java 程序在 Windows 主机上。但由于发送脚本是在 Linux 上,我希望从那个答案中我应该得到一个“连接被拒绝”。
  • 我不相信backlog 会阻止多个连接,而是会创建一个未接受连接的队列。客户端 2 没有被拒绝的原因可能是因为客户端 1 在客户端 2 发出请求时已经被接受。我自己没有使用过backlog 参数(从来没有使用过),但根据我在网上阅读的内容,情况似乎如此。试试看:让客户端 1 发出请求,不接受客户端 1 服务器端的请求。与客户端 2 连接,看看它是否被拒绝。
  • 设法跳上电脑进行测试。似乎是对的:backlog 创建了一个未接受的连接队列。你的第二个客户没有被拒绝,因为你的第一个客户已经被接受了,所以积压工作没有满,因此第二个客户没有被拒绝。
  • 那么,这甚至不是为了限制接受的连接?这样就可以解释了。您能否将其写为答案,然后我可以将其标记为已解决。

标签: java sockets


【解决方案1】:

您可以在接受一个连接后关闭 ServerSocket。这对你有用。

要更深入地了解这个问题,您可以参考答案 (Why aren't ServerSocket connections rejected when backlog is full?)

【讨论】:

  • 嗯,是的,我当然可以手动做一些事情,但我认为我宁愿使用已经实现的东西。至于链接,这就是我的意思。由于 Windows 发出这个 RST 问题,我应该拒绝连接,但我没有。
  • 我认为上面的评论已经回答了。但无论如何,在套接字调用之间的时间空间中(通过 accept() 方法调用),传入的客户端连接请求存储在操作系统维护的队列中,在你的情况下是它的窗口。随后对 accept() 的调用从队列中删除请求,或者如果没有等待的客户端则阻塞。 “backlog”参数控制这个队列的长度。当客户端请求连接并且队列已满时,请求将失败并抛出 ConnectionException。
  • 否则它将被添加到队列中,以防您随后的呼叫被添加到队列中。
【解决方案2】:

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

积压参数处理您的服务器可以维持多少未接受的连接。如果您的积压为 1 并且客户端连接到您的服务器,则接受第一个连接将允许接受其他连接。但是,如果您不接受第一个连接,任何未来连接到服务器的客户端都将被拒绝。

积压为 2 将支持两个未接受的连接并拒绝第三个连接。


此行为可能因您的平台而异。欲了解更多信息,请查看the answer to: Why aren't ServerSocket connections rejected when backlog is full?

回答该问题的用户是网络领域的专业人士,如果您有兴趣进一步了解与 Java 中的服务器套接字相关的问答†,请联系more content related to Java server sockets。


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

【讨论】:

  • 或者超时,具体取决于平台。而 backlog 参数只是一个提示。系统可以上下调整:见here。
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2021-12-30
  • 2013-04-05
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多