我正在为服务器编写测试程序。在测试应用程序中,我尝试将大量客户端连接到服务器,但过了一段时间后会出现类似这样的错误:

Connection reset by peer: socket write error                   

java.net.SocketException: Connection reset                     

java.net.ConnectException: Connection refused: connect

我为连接到服务器的每个客户端使用一个新套接字。

有人可以告诉我这种奇怪的行为吗?

有帮助吗?

解决方案

很遗憾,您没有提供有关服务器性质的详细信息。我想你正在编写一个典型的TCP服务器。在这个答案中,我将谈论任何特定于Java的细节。

简短的建议是:在客户端连接之间插入延迟。没有它,您正在积极模拟对服务器的DoS攻击。

对于较长的一个,请阅读以下内容。

通常,TCP服务器只通过调用(在可爱的C接口中) int sockfd = socket(...)函数创建1 监听,并传递结果( sockfd 在我们的例子中)到 bind() listen()函数。在准备之后,服务器将调用 accept(),这将使服务器陷入沉睡(如果套接字被标记为阻塞),并且如果地球另一端的客户端将开始呼叫 connect()函数,比 accept()(在服务器端)在OS内核的支持下将创建连接的套接字

通过查看 listen()函数,可以了解可能的挂起连接的实际数量。 listen()有一个 backlog 参数,它定义 OS内核应该排队到套接字的最大连接数(这基本上是 SYN_RCVD ESTABLISHED 状态中的所有连接。从历史上看,20世纪80年代积压的推荐值是5,这在我们这个时代显然是悲惨的。例如,在FreeBSD 7.2中,可以通过键入来猜测 backlog 硬限制

% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128

并在Fedora 10中:

% cat /proc/sys/net/core/somaxconn
128

P.S。,点击 对不起我糟糕的英语。

其他提示

您的网络/应用服务器一次只能为有限数量的客户提供服务。

达到此限制时,您将收到拒绝/重置的连接。

希望能回答你的问题。

干杯

操作系统和网络服务器限制了您可以开始/接受的连接速度和连接数。如果您想在服务器上进行性能测试,请尝试使用Apache JMeter,因为它具有这些限制的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top