Java accept()是一种阻塞方法——要加速多个侦听器吗?

Java accept()是一种阻塞方法——要加速多个侦听器吗?,java,multithreading,sockets,Java,Multithreading,Sockets,在申请中, ServerSocket实例正在接受连接 并将其传递给一个线程。该端口上的连接 都是螺纹的——一个连接一个螺纹。套接字侦听器如下所示: serverSocket = new ServerSocket(port); for (;;) { // keep listening Socket socket = serverSocket.accept(); Thread t = new LRcvr(socket); t.start(); } 我想知道的是,还有更多

在申请中,
ServerSocket
实例正在接受连接 并将其传递给一个线程。该端口上的连接 都是螺纹的——一个连接一个螺纹。套接字侦听器如下所示:

serverSocket = new ServerSocket(port);
for (;;) {  // keep listening
   Socket socket = serverSocket.accept();  
   Thread t = new LRcvr(socket);  
   t.start();
}
我想知道的是,还有更多的事情要做吗 在该插座上的高流量条件下加快此速度

我特别关心的是。 在多个连接请求中,例如
req-1
req-2
req-1
req-2
之前到达端口。但是,套接字和req-1之间的连接 由于自身的原因,无法及时建立,这会阻碍
req-2
被“听到”其请求,从而在端口连接。 这一切都是因为方法
ServerSocket.accept()
是一个阻塞方法

一定有个聪明的方法来解决这个问题。这是什么

创建多个套接字侦听器以侦听和接受连接请求 我想起来了,但这会起作用吗?如何?我应该多线程连接套接字侦听器吗? 那么我应该担心什么呢

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


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

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

如果尚未建立与req-1的连接,则尚未将其公开给应用程序级别<代码>接受()将在连接req-2时愉快地解除阻塞


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

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

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

如果尚未建立与req-1的连接,则尚未将其公开给应用程序级别<代码>接受()将在连接req-2时愉快地解除阻塞

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

在多个连接请求中,比如req-1和req-2,req-1在req-2之前到达端口。然而,套接字和req-1之间的连接由于其自身的原因没有及时建立

一些原因,比如?定义在任何情况下,如果没有建立连接,它永远不会到达TCP积压队列,更不用说accept()方法了

这将阻止req-2“听到”其请求

不,没有

从而在端口连接

不,没有。连接请求完全由TCP处理,并放置在待办事项队列中,而不管accept()在做什么或不在做什么

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

不,不是。首先,“这整件事”根本不存在,其次,accept()阻塞的事实与它无关

一定有个聪明的方法来解决这个问题

这里没有什么可以“走动”的。你的问题是虚构的

在多个连接请求中,比如req-1和req-2,req-1在req-2之前到达端口。然而,套接字和req-1之间的连接由于其自身的原因没有及时建立

一些原因,比如?定义在任何情况下,如果没有建立连接,它永远不会到达TCP积压队列,更不用说accept()方法了

这将阻止req-2“听到”其请求

不,没有

从而在端口连接

不,没有。连接请求完全由TCP处理,并放置在待办事项队列中,而不管accept()在做什么或不在做什么

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

不,不是。首先,“这整件事”根本不存在,其次,accept()阻塞的事实与它无关

一定有个聪明的方法来解决这个问题


这里没有什么可以“走动”的。您的问题是虚构的。

您所说的“新连接的应用程序级处理”是什么意思?您可以更具体地说,TCP连接的所有低级内容通常由操作系统(内核)处理。操作系统监听网络,识别建立TCP连接的请求,执行所有这三种方式的握手等。您在示例中描述的可能发生在操作系统级别,但操作系统以非阻塞方式处理连接,没有问题。当您调用
accept()
时,您基本上是要求操作系统为您提供第一个随时可用的连接,如果没有随时可用的连接,该调用将阻止您的应用程序。操作系统未被呼叫阻止。这就是我的意思。你说的“新连接的应用程序级处理”是什么意思?你能说得更具体一点吗?TCP连接的所有底层内容通常由操作系统(内核)处理。操作系统监听网络,识别建立TCP连接的请求,执行所有这三种方式的握手等。您在示例中描述的可能发生在操作系统级别,但操作系统以非阻塞方式处理连接,没有问题。当您调用
accept()
时,您基本上是要求操作系统为您提供第一个随时可用的连接,如果没有随时可用的连接,该调用将阻止您的应用程序。操作系统未被呼叫阻止。这就是我的意思。