Java服务器-多个端口?
我要对服务器进行编程,但是想知道我的想法是否可能。我的程序将在多个端口上输出到多个客户端-每个端口都可以由多个客户端访问。
通常,我会使用线程套接字服务器,但是在这种情况下,我需要它可用于多个端口。我想到的用法是下面一个模糊的伪代码:
- 启动服务器
- 侦听多个端口上的传入连接
- 识别正在连接的端口
- 如果是端口1,请启动一个线程以侦听客户端并输出消息类型
x
- 如果是端口2,请启动一个线程以侦听客户端并输出消息类型
y
- 如果是端口1,请启动一个线程以侦听客户端并输出消息类型
希望这很有道理,您可以看到我正在尝试做的事情。简而言之:侦听选定的端口,根据要连接的端口创建螺纹插座连接。
这是完全可行的,还是我要结束多线程线程套接字服务器?
编辑:更改了措词以更好地反映问题。
回答:
一个实例不可能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