Java服务器-多个端口?

我要对服务器进行编程,但是想知道我的想法是否可能。我的程序将在多个端口上输出到多个客户端-每个端口都可以由多个客户端访问。

通常,我会使用线程套接字服务器,但是在这种情况下,我需要它可用于多个端口。我想到的用法是下面一个模糊的伪代码:

  • 启动服务器
  • 侦听多个端口上的传入连接
  • 识别正在连接的端口

    • 如果是端口1,请启动一个线程以侦听客户端并输出消息类型 x
    • 如果是端口2,请启动一个线程以侦听客户端并输出消息类型 y

希望这很有道理,您可以看到我正在尝试做的事情。简而言之:侦听选定的端口,根据要连接的端口创建螺纹插座连接。

这是完全可行的,还是我要结束多线程线程套接字服务器?

编辑:更改了措词以更好地反映问题。

回答:

一个实例不可能ServerSocket监听多个端口。您当然可以有多个ServerSocket。但是,正如您已经知道的,ServerSocket.accept阻塞。

您可以改用ServerSocketChannel。它们以类似的方式使用,但不会阻塞。

如果在ServerSocketChannel.accept调用时没有挂起的连接,则它仅返回null。

您可以与使用Selector,以使用一组通道和块,直到至少有一个挂起的连接。

我不记得如何使用它们的细节,但这个似乎是一个体面的代码示例。

编辑:这是我自己的示例(伪ish)

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();

Socket socket = client.socket();

// create new thread to deal with connection (closing both socket and client when done)

}

}

}

// tidy up selector and channels

以上是 Java服务器-多个端口? 的全部内容, 来源链接: utcz.com/qa/423038.html

回到顶部