1

我正在为服务器编写测试程序。在测试应用程序中,我尝试将大量客户端连接到服务器,但一段时间后会出现如下各种错误:

Connection reset by peer: socket write error                   

或者

java.net.SocketException: Connection reset                     

或者

java.net.ConnectException: Connection refused: connect

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

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

4

3 回答 3

0

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

于 2009-06-22T18:11:34.253 回答
0

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

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

希望这能回答你的问题。

干杯

于 2009-06-26T10:51:45.933 回答
0

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

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

对于较长的,请阅读下文。

通常,一个 TCP 服务器通过调用(在可爱的 C 接口中)函数,并将结果(在我们的例子中)传递给函数,只创建 1 个监听。在这些准备之后,服务器将调用一个将使服务器进入休眠状态(如果套接字被标记为阻塞)并且如果地球另一端的客户端将开始调用一个函数,而不是(在服务器端)操作系统内核的支持将创建连接的套接字int sockfd = socket(...)sockfdbind()listen()accept()connect()accept()

The actual number of possible pending connectins can be known by looking at the listen() function. listen() has a backlog parameter which defines the maximum number of connection the OS kernel should queue to the socket (this is basically a sum of all connections in SYN_RCVD and ESTABLISHED states). Historically the recommended value for backlog in 1980s was something like 5 which is obviously miserable in our days. In FreeBSD 7.2, for example, a hard limit for backlog may be guessed by typing:

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

and in Fedora 10:

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

P.S.
Sorry for my terrible English.

于 2009-06-29T21:00:30.543 回答