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()
时,您基本上是要求操作系统为您提供第一个随时可用的连接,如果没有随时可用的连接,该调用将阻止您的应用程序。操作系统未被呼叫阻止。这就是我的意思。