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

标签 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 之前到达端口。但是,socket & req-1 之间的连接 由于自身的某种原因没有及时建立,这会阻止 req-2 被“听到”它的请求并因此在端口连接。 这整件事是因为 ServerSocket.accept() 方法是一个阻塞方法。

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

创建多个套接字监听器来监听和接受连接请求 浮现在脑海中,但这行得通吗-如何?我应该多线程套接字监听器吗? 那我应该担心什么?

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

TIA

最佳答案

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

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

如果与 req-1 的连接尚未建立,则它尚未暴露给应用程序级别。 accept() 将在 req-2 连接时愉快地解锁。

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

关于java - ServerSocket.accept() 是一种阻塞方法——多个监听器来加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564486/

相关文章:

java - 用java处理 future 的日期

java - 在 Spring Data Jpa Repository 而不是实体中设置表名称

java - 从一个线程调用方法到另一个线程在另一个线程中执行

multithreading - 将矩阵 (Vec<Vec<f64>>) 只读传递给多个线程

Java - 从客户端获取服务器的主机名和/或 ip 地址

c# - 在Windows上,C#在数据到达之前或之后,Socket.BeginReceive()是否占用后台线程?

java - 排序 Controller : how to use a dynamic filter

java - 使用 Saxon 通过 XSLT 生成 URL

java - EventQueue.isDispatchThread() 中的无限循环

android - 强制关闭 TCP/IP (Telnet) 连接