У меня есть ServerBootstrap, принимающий данные от клиентов. Большинство из них поступают из любой конечной точки, которая к ней подключается, однако я также хочу обрабатывать данные, поступающие из определенной конечной точки.
В основном я читаю и пишу строки из n + 1 соединений. Если одно конкретное соединение когда-либо закроется, мне нужно будет снова открыть его.
В настоящее время я пытаюсь подключить Bootstrap к определенной конечной точке, а ServerBootstrap обрабатывает все входящие соединения, но sync (), который запускает один из Bootstraps, блокирует остальную часть приложения, и я не могу запустить другое один.
Или можно просто создать канал с нуля, подключиться к нему и добавить его в 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 непрерывно выскакивает из очереди и записывает данные в каждый канал. Есть ли у кого-нибудь идеи относительно того, как лучше всего подойти к этому?
В настоящее время я пытаюсь открыть клиента достаточно далеко, чтобы создать канал, и каким-то образом добавить этот канал в ту же группу каналов, что и дочерние серверы. Эта реализация последовательно создает клиент и сервер.
Вы знаете, что .sync() означает «дождаться завершения операции»? В вашем случае вы синхронизируете дождитесь завершения клиентского канала




Мне непонятно, чего вы пытаетесь достичь. Вы пытаетесь запустить клиент и сервер в одном приложении, в одном потоке?