Java - 服务器侦听多个端口

Java - Server listens on many ports

我的服务器中有一些简单的代码等待客户端连接到端口 4444

try {
  serverSocket = new ServerSocket(4444);
  } catch (IOException e) {
    //blah
}

while (true) {
  try {
    clientSocket = serverSocket.accept();
    //do something
} catch (IOException ex) {
    //blah
}

我现在要扩展什么让我的服务器侦听 10 个不同的端口。起初我在看类似这样的东西:for (int i = 4444; i < 4454; i++) 但它没有正常工作。

现在我正在研究 Java NIO ServerSocketChannel。我在网上找到了这段代码(感谢@Dunes!)

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));
   // 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 connection (closing both socket and client when done)
      }
   }
}

但是我无法执行它。在 while (iterator.hasNext()) 块中,server.accept 中的 server 表示 "server cannot be resolved"。这是为什么? NIO ServerSocketChannel 让我的服务器监听多个端口是否正确?如果不是,我的服务器接受多个端口的最佳方法是什么?

我不知道你为什么认为你需要这个,但你的编译错误应该解决如下:

ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();

您的代码中存在明显错误...

SocketChannel client = server.accept(); //SERVER CANNOT BE RESOLVED!!!!

如@EJP 所述,需要将其替换为...

ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel client = server.accept();

但是,虽然您可以使用端口来区分客户端,但如果您稍微考虑一下,它就无法扩展。您立即将客户端数量限制为可用端口的数量。更糟糕的是,您正在阻止其他应用程序使用这些端口(可能是所有可用端口)。正如@EJP 还提到的,您需要在套接字上定义适当的协议。

您可能想看一下 java 个插座 tutorial。它不会涉及 NIO,但会给出这些事情通常如何完成的基本概念。