3

在 Java TCP/IP 套接字上处理多个请求是否很容易。只需接受一条消息并生成一个线程。接受另一条消息并产生另一个线程。问题是一旦你开始产生线程,事情就会变得更加不确定。假设您有 10 个客户端,其中一个客户端不断发出请求,另外 9 个客户端以 10% 的超活跃客户端发送请求,发现更难查看。

您可以处理此问题的一种方法是在您的服务器中拥有一个信号量的哈希图,其中每个客户端都有一个相应的信号量。在处理任何客户端的请求之前,您可以让它通过其信号量并配置信号量,以便每个客户端在任何时候只能有一定数量的请求。

在这个阶段,我想是的,但有更好的方法或图书馆可以做到这一点吗?

4

1 回答 1

5

...但是有没有更好的方法...?

我使用每个 serversocket 一个接受线程和一个预生成线程池来处理工作负载。接受线程只接受连接(不做任何其他事情)并将处理程序套接字提供给池中的线程之一。然后该线程与处理程序套接字一起工作,直到客户端完成,然后关闭处理程序套接字。

您可以根据需要扩展此设置:如果您注意到接受线程大部分时间都在等待池线程,那么您需要 x2 池线程的数量,如果您注意到接受 -线程是您创建(A)另一个接受线程和(B)另一个接受连接的套接字的瓶颈,并且可以选择(C)将它们放在另一台机器上。

如果客户端比其他客户端更重要,则您描述的与一个超活跃客户端的特定问题可能是有意/期望的:在这种情况下,您无需做任何事情。或者它可以被认为是拒绝服务攻击,在这种情况下,你应该有一个启发式方法,它只是断开客户端并暂时禁止其 IP 地址。

于 2012-10-19T09:48:13.843 回答