【发布时间】: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创建了一个未接受的连接队列。你的第二个客户没有被拒绝,因为你的第一个客户已经被接受了,所以积压工作没有满,因此第二个客户没有被拒绝。 -
那么,这甚至不是为了限制接受的连接?这样就可以解释了。您能否将其写为答案,然后我可以将其标记为已解决。