我有一个ServerBootstrap接受来自客户端的数据。它们大多数来自任何连接到它的端点,但是我也想处理来自特定端点的数据。
我基本上是从n + 1个连接中读写字符串。如果一个特定的连接关闭,则需要重新打开它。
当前,我正在尝试将Bootstrap连接到特定端点,并使用ServerBootstrap处理所有传入连接,但是启动其中一个Bootstrap的sync()会阻止应用程序的其余部分,而我无法运行另一个。
或者是否可以从头开始创建一个频道,连接到该频道,然后将其添加到EventLoopGroup中?
这是到目前为止我所拥有的一个例子。当前startServer()在channelfuture.channel()。closeFuture()。sync()处阻塞
private Channel mChannel;
private EventLoopGroup mListeningGroup;
private EventLoopGroup mSpeakingGroup;
public void startServer() {
try {
ServerBootstrap bootstrap = new ServerBootstrap()
.group(mListeningGroup, mSpeakingGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new ServerInitializer());
ChannelFuture channelFuture = bootstrap.bind(mListeningPort).sync();
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
mListeningGroup.shutdownGracefully();
mSpeakingGroup.shutdownGracefully();
}
}
public void startClient() throws InterruptedException {
Bootstrap bootstrap = new Bootstrap()
.group(mSpeakingGroup)
.channel(NioSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ClientInitializer());
ChannelFuture future = bootstrap.connect(mAddress,mPort).sync();
mChannel = future.channel();
mChannel.closeFuture().addListener((ChannelFutureListener) futureListener -> mChannel = null).sync();
}
一旦n + 1个套接字中的任何一个读取了数据,就会将其消息放入PriorityQueue中,而while循环会不断弹出队列,并将数据写入每个Channel。有人对实现此目标的最佳方法有任何想法吗?