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

Java 在TCP/IP套接字上处理多个请求,java,multithreading,sockets,tcp-ip,Java,Multithreading,Sockets,Tcp Ip,在Java TCP/IP套接字上处理多个请求是否非常容易。只需接受一条消息并生成一个线程。接受另一条消息并生成另一个线程。问题是一旦你开始产生线程,事情就会变得更加不确定。假设你有10个客户机,其中一个客户机不断发出请求,而另外9个客户机以10%的超活跃客户机发送请求,你会发现很难查看 处理这个问题的一种方法是在服务器中有一个信号量的hashmap,其中每个客户端都有一个对应的信号量。在处理任何客户端的请求之前,您可以让它通过其信号量并配置信号量,以便每个客户端在任何时候都只能有一定数量的请求

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

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

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

。。。但是有没有更好的方法

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

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


如果某个超活动客户机比其他客户机更重要,那么您所描述的某个超活动客户机的特定问题可能是有意/想要的:在这种情况下,您无需执行任何操作。或者可以将其视为拒绝服务攻击,在这种情况下,您应该有一种启发式方法,只需断开客户端连接并暂时禁止其ip地址。

您的意思是像公平消息队列一样?但我认为,在每一个请求之后,线程都会自动进入睡眠状态就足够了,这样其他线程就有机会被唤醒,避免饥饿。就像一条消息一样。但通常消息在进入队列之前通过TCP/IP套接字。如果此套接字是多线程的,那么您只能使用“公平”选项。我想,“其他9个没有那么多火力的人是看不见的。”。那没有道理。没有理由认为多线程TCP服务器会偏爱一个客户端而不是另一个客户端。不管怎么说,整个事情都与网络有关。所有线程最初都被阻塞,等待传入的请求。如果一个客户端发送的请求是另一个客户端的10倍,那么它将获得10倍的服务,但是没有理由他会获得超过10倍的服务。线程连接是baby的第一个网络模型。你应该研究非阻塞io。我认为你一点也没有说得更清楚。我想你刚刚想出了一个假想的问题,并试图找到解决办法。有像Tomcat这样的Java服务器,它们部署在数以百万计的服务器上,处理数十万个客户端,每个客户端对这个所谓的“问题”都不做任何事情。它不存在。触发90%请求的客户端应获得90%的服务。你有证据证明它不存在吗?类似于我所说的,你正在使用一个池来处理请求。Java层中没有任何东西可以检查DOS。你是说这应该是一个N/W层。这主意不错。只是想知道你的想法。你会使用非阻塞i/o吗?如果不是,为什么不使用?你是否在Java中进行DOS检测取决于你自己,你可以在Java中通过让接受线程在hashmap中查找ip地址或让工作线程决定并断开连接来实现。非阻塞IO:首先我不想麻烦它,毕竟只有工作线程被阻塞,如果所有其他线程都被阻塞,您可以向池中添加更多的工作线程。您可以稍后添加它,但在开始时,我总是尽量保持简单和代码线性。