Netty Добавить канал в ServerBootstrap

У меня есть 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 непрерывно выскакивает из очереди и записывает данные в каждый канал. Есть ли у кого-нибудь идеи относительно того, как лучше всего подойти к этому?

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

spinlok 12.08.2018 04:09

В настоящее время я пытаюсь открыть клиента достаточно далеко, чтобы создать канал, и каким-то образом добавить этот канал в ту же группу каналов, что и дочерние серверы. Эта реализация последовательно создает клиент и сервер.

CovaDax 13.08.2018 14:02

Вы знаете, что .sync() означает «дождаться завершения операции»? В вашем случае вы синхронизируете дождитесь завершения клиентского канала

Ferrybig 18.08.2018 18:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
208
0

Другие вопросы по теме