处理 TCP/IP 套接字上的多个请求

dub*_*ech 3 java sockets multithreading tcp-ip

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

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

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

Ber*_*ann 5

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

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

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

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