在申请中,
ServerSocket
实例正在接受连接
并将其传递给线程。该端口的连接
都是线程的 - 一个连接的一个线程。套接字侦听器看起来像这样:
serverSocket = new ServerSocket(port);
for (;;) { // keep listening
Socket socket = serverSocket.accept();
Thread t = new LRcvr(socket);
t.start();
}
我想知道的是,还有更多工作要做 在该套接字上的高流量条件下加快速度。
我特别关注ServerSocket.accept()
。
在多个连接请求中,请说req-1
& req-2
,
req-1
在req-2
之前到达端口。但是,插座和插座之间的连接; req-1
由于某种原因没有及时建立,这就阻止了
req-2
被“听到”了它的请求,从而在港口连接。
这一切都是因为方法ServerSocket.accept()
是阻塞方法。
必须有一种聪明的方法来解决这个问题。它是什么?
创建多个套接字侦听器以听取和接受连接请求 浮现在脑海中,但是会有用 - 怎么样?我应该多线程套接字监听器吗? 那么我应该关注什么呢?
注意:我们只能操作一个端口 - 这里不能选择多个套接字。
TIA
答案 0 :(得分:4)
在您的示例中,req-1不会阻止req-2被听到。
ServerSocket.accept()
仅阻止新连接的应用程序级处理,并在建立连接时触发。
如果尚未建立与req-1的连接,则尚未向应用程序级别公开。 1}}将很高兴解锁,因为req-2已连接。
(为每个连接产生一个新线程可能会有问题。如果你接受10 000个连接怎么办?我不确定现代JVM和/或内核能否有效地处理这么多线程。)
答案 1 :(得分:-1)
在多个连接请求中,请说req-1& req-2,req-1在req-2之前到达端口。但是,插座和插座之间的连接; req-1由于其自身的某些原因而未及时建立
某些原因如?限定。在任何情况下,如果没有建立连接,它永远不会进入TCP积压队列,更不用说接受accept()方法。
这阻止了req-2被"听到"它的要求
不,它没有。
因此在港口连接。
不,它没有。连接请求完全由TCP处理并放在积压队列中,无论accept()是做什么或不做什么。
这一切都是因为ServerSocket.accept()方法是阻塞方法。
不,不是。首先,整个事情'甚至不存在,其次,accept()阻塞的事实与此无关。
必须有一种聪明的方法来解决这个问题。
此处没有任何内容可以绕过'。你的问题是虚构的。