ServerSocket.accept()是一种阻塞方法 - 多个侦听器加速?

时间:2014-07-03 23:01:03

标签: java multithreading sockets

在申请中, ServerSocket实例正在接受连接 并将其传递给线程。该端口的连接 都是线程的 - 一个连接的一个线程。套接字侦听器看起来像这样:

serverSocket = new ServerSocket(port);
for (;;) {  // keep listening
   Socket socket = serverSocket.accept();  
   Thread t = new LRcvr(socket);  
   t.start();
}

我想知道的是,还有更多工作要做 在该套接字上的高流量条件下加快速度。

我特别关注ServerSocket.accept()。 在多个连接请求中,请说req-1& req-2req-1req-2之前到达端口。但是,插座和插座之间的连接; req-1 由于某种原因没有及时建立,这就阻止了 req-2被“听到”了它的请求,从而在港口连接。 这一切都是因为方法ServerSocket.accept()是阻塞方法。

必须有一种聪明的方法来解决这个问题。它是什么?

创建多个套接字侦听器以听取和接受连接请求 浮现在脑海中,但是会有用 - 怎么样?我应该多线程套接字监听器吗? 那么我应该关注什么呢?

注意:我们只能操作一个端口 - 这里不能选择多个套接字。

TIA

2 个答案:

答案 0 :(得分:4)

在您的示例中,req-1不会阻止req-2被听到。

ServerSocket.accept()仅阻止新连接的应用程序级处理,并在建立连接时触发。

如果尚未建立与req-1的连接,则尚未向应用程序级别公开。

(为每个连接产生一个新线程可能会有问题。如果你接受10 000个连接怎么办?我不确定现代JVM和/或内核能否有效地处理这么多线程。)

答案 1 :(得分:-1)

  

在多个连接请求中,请说req-1& req-2,req-1在req-2之前到达端口。但是,插座和插座之间的连接; req-1由于其自身的某些原因而未及时建立

某些原因如?限定。在任何情况下,如果没有建立连接,它永远不会进入TCP积压队列,更不用说接受accept()方法。

  

这阻止了req-2被"听到"它的要求

不,它没有。

  

因此在港口连接。

不,它没有。连接请求完全由TCP处理并放在积压队列中,无论accept()是做什么或不做什么。

  

这一切都是因为ServerSocket.accept()方法是阻塞方法。

不,不是。首先,整个事情'甚至不存在,其次,accept()阻塞的事实与此无关。

  

必须有一种聪明的方法来解决这个问题。

此处没有任何内容可以绕过'。你的问题是虚构的。