在 Java 中侦听多个端口的多线程池服务器 -
Multithreaded pooled server listening on multiple ports in Java -
我正在尝试弄清楚如何创建一个 Java 多线程服务器,该服务器可以侦听多个端口并为它接受请求的每个端口设置线程池。
我已经实现了一个监听单个 eport 的功能性多线程池服务器,如下所示:
public void run() {
synchronized (this) {
this.runningThread = Thread.currentThread();
}
openSocketServer();
while (!isStopped()) {
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if (isStopped()) {
System.out.println("Server Stopped.");
break;
}
throw new RuntimeException("Error with accepting client connection", e);
}
this.threadPool.submit(new HandlerRichieste(clientSocket, this));
}
this.threadPool.shutdown();
System.out.println("Server stopped");
}
并且我设法使用 NIO 库实现了一个监听多个端口的服务器;此实现的问题在于它仅使用单个线程来处理来自不同端口的请求,因此按顺序处理它们并降低性能:
Selector selector = Selector.open();
int[] ports = {4000,4001,6000};
for (int port : ports) {
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(port));
// from here we are only interested when accept evens occur on this socket
server.register(selector, SelectionKey.OP_ACCEPT);
}
while (selector.isOpen()) {
selector.select();
Set readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
if (key.isAcceptable()) {
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
Socket socket = client.socket();
// create new thread to deal with the connection coming from that port (closing both socket and client when done)
}
}
}
我如何合并它们 - 导致服务器侦听多个端口,每个端口都有一个线程池?
是否有可能在不使用 NIO 库的情况下创建一个监听多个端口的多线程池服务器?
如果是这样,谁能告诉我在没有 Java NIO 的情况下为每个端口设置一个线程池的机制?
您已经能够创建一个服务器,其中一个线程在一个端口上等待连接,并使用来自一个特定池的线程为传入连接提供服务。
是什么阻止您三次创建此模式?然后,您将监听三个端口并使用来自三个特定线程池的线程为传入连接提供服务。您唯一需要注意的是:
在一个套接字上等待连接可能会阻塞线程。
作为一种解决方案,只需创建三个线程,每个线程监听一个端口。
我正在尝试弄清楚如何创建一个 Java 多线程服务器,该服务器可以侦听多个端口并为它接受请求的每个端口设置线程池。
我已经实现了一个监听单个 eport 的功能性多线程池服务器,如下所示:
public void run() {
synchronized (this) {
this.runningThread = Thread.currentThread();
}
openSocketServer();
while (!isStopped()) {
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if (isStopped()) {
System.out.println("Server Stopped.");
break;
}
throw new RuntimeException("Error with accepting client connection", e);
}
this.threadPool.submit(new HandlerRichieste(clientSocket, this));
}
this.threadPool.shutdown();
System.out.println("Server stopped");
}
并且我设法使用 NIO 库实现了一个监听多个端口的服务器;此实现的问题在于它仅使用单个线程来处理来自不同端口的请求,因此按顺序处理它们并降低性能:
Selector selector = Selector.open();
int[] ports = {4000,4001,6000};
for (int port : ports) {
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(port));
// from here we are only interested when accept evens occur on this socket
server.register(selector, SelectionKey.OP_ACCEPT);
}
while (selector.isOpen()) {
selector.select();
Set readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
if (key.isAcceptable()) {
SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!
Socket socket = client.socket();
// create new thread to deal with the connection coming from that port (closing both socket and client when done)
}
}
}
我如何合并它们 - 导致服务器侦听多个端口,每个端口都有一个线程池? 是否有可能在不使用 NIO 库的情况下创建一个监听多个端口的多线程池服务器? 如果是这样,谁能告诉我在没有 Java NIO 的情况下为每个端口设置一个线程池的机制?
您已经能够创建一个服务器,其中一个线程在一个端口上等待连接,并使用来自一个特定池的线程为传入连接提供服务。
是什么阻止您三次创建此模式?然后,您将监听三个端口并使用来自三个特定线程池的线程为传入连接提供服务。您唯一需要注意的是: 在一个套接字上等待连接可能会阻塞线程。
作为一种解决方案,只需创建三个线程,每个线程监听一个端口。