Java - 服务器侦听许多端口

时间:2015-08-09 19:47:17

标签: java server nio 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中的server.accept表示&#34;服务器无法解析&#34;。这是为什么? NIO ServerSocketChannel我认为让我的服务器在许多端口上监听是正确的吗?如果没有,那么我的服务器接受多个端口的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

Seat

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

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

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

您可能需要查看java套接字tutorial。它没有进入NIO,但它会给出这些事情通常如何完成的基本概念。