Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Netty
#1
Добрый день!

Нужна помощь в понимании этой библиотеки.

При создании сервера указываем пайплайн:



Код:
ServerBootstrap bootstrap = new ServerBootstrap(
                new NioServerSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool()));

        
        bootstrap.setPipelineFactory(new FactorialServerPipelineFactory());




далее в пайплайн указываются классы обрабатыаюшие как входящие(енкодер) так и исходящие(декодер) потоки байт,
а также логика обработки (хандлер):

Код:
public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = pipeline();

        

        
        pipeline.addLast("decoder", new Decoder());
        pipeline.addLast("encoder", new Encoder());

        
        pipeline.addLast("handler", new Handler());

        return pipeline;
    }





в хандлере идет обработка и возбуждение возможных ошибок:
Код:
@Override
    public void messageReceived(
            ChannelHandlerContext ctx, MessageEvent e) {
        // Send back the received message to the remote peer.
        transferredBytes.addAndGet(((ChannelBuffer) e.getMessage()).readableBytes());
        e.getChannel().write(e.getMessage());
    }

    @Override
    public void exceptionCaught(
            ChannelHandlerContext ctx, ExceptionEvent e) {
        // Close the connection when an exception is raised.
        logger.log(
                Level.WARNING,
                "Unexpected exception from downstream.",
                e.getCause());
        e.getChannel().close();
    }





Т.е когда приходит поток байт от клиента, этот поток попадает в енкодер, там идет разделение его на отдельные
пакеты, и передаются это все в обработчик хандлер, хендлер вычисляет логику и передает пакет в декодер, а он
отправляет пакет клиенту. Так ?)

И если входящие данные зашифрованы, например blowfish`ем, то расшифровка происходит в енкодер\декодер или в хендлер?
Ответ
#2
Поток байт попадает в первый обработчик, Netty не важно, Encoder это или Decoder, различия между ними только в том, что в ваш Encoder пойдет исходящий поток, а Decoder обработает только входящий поток. В своем Encoder'e вы должны обработать пакет, зашифровать, и вернуть буфер, который будет записан в канал. Decoder же, наоборот, принимает буфер, формирует из него пакет, и возвращает его на выполнение. Вот этот пакет от Decoder'а и нужно обрабатывать в Handler'e.
Ответ
#3
Чем Вам дефолтный NIO то не угодил?
Ответ
#4
тоесть он смотрит:
ага инкодер - посылает туда поток байтов,
- ага метод по обработки входящих байтов, обрабатываем

дальше передает байты в декодер, но там метода обработки нету, значит пропускает
шаг, и направляет в хендлер ,

и потом наоборот все 3 этапа?
Ответ
#5
Нет. Возможно я не так выразился. Для Netty нет различий в Handler'ах, но есть различие в интерфейсах, которые они реализуют(ChannelUpstreamHandler или ChannelDownstreamHandler). Ваш входящий поток байтов\исходящий пакет обязательно попробует постучаться во все ChannelHandler'ы последовательно, начиная с первого. Netty пустит его не во все, естественно, только в обработчики входящих\исходящих потоков соответственно. Суть в том, что ваш Encoder должен наследоваться от обработчика исходящего потока, а Decoder, как и Handler - от обработчик входящего потока.

Допустим:
Исходящий(серверный) пакет отправлен в канал. Он попадает в Encoder, там с ним производятся все действия, шифрование, и всё такое.. На выходе из Encoder'а - массив байтов, который и записывается в канал. Всё, обработка исходящих сообщений закончена.

Пришел входящий пакет от клиента. Сперва он попадает в Decoder. Decoder проверяет, дошел ли пакет полностью, расшифровывает его, и всё такое.. на выходе из Decoder'а - готовый (клиентский) пакет. Этот пакет посылается дальше по обработчикам, и попадает в Handler, так как он в вашей очереди стоит после Decoder'а. Handler смотрит, что это ни за пакет, и соответствующим образом его обрабатывает.
Ответ
#6
Анзо новые "кодиры" боятся всего что заложено изначально в системе , и стараются юзать уже готовые либы и фреймворки. Сейчас каждый новый выпускник С++'ник не представляет как жить без STL и Буста
:negodue:
Ответ
#7
iWord Написал:Анзо новые "кодиры" боятся всего что заложено изначально в системе , и стараются юзать уже готовые либы и фреймворки. Сейчас каждый новый выпускник С++'ник не представляет как жить без STL и Буста
оно и видно, для того, чтобы заюзать 1 класс, они тянут всю библиотеку, заместь того чтоб использовать стандартные классы и потом получается проект с 100500-ю библиотеками зависящий от нихSad
Ответ
#8
Оффтоп
Ответ
#9
Интересно, кто-нибудь делал бенчмарки netty vs java nio2 ? Что-то мне подсказывает, что перевес будет не в сторону сана оракла.
Ответ
#10
тестов nio 2 действительно либо пока нет, либо они малочислены и их трудно найти.
На хабре читал, что на дефолтном nio держали 512 к подключений, на нетти - 300 к с чем то.

Потом же были новости о 1 млн конектов в netty.

В любом случае приложение на нетти получается более красивым, компактным и возможностей для расширения больше.

Спасибо за ответы,будем дальше копаться...
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Netty StartUp grizly 15 7,232 08-11-2013, 04:49 PM
Последний пост: KID
  Netcore Source (Netty) n3k0nation 3 4,531 05-03-2010, 07:10 PM
Последний пост: Aquanox

Перейти к форуму:


Пользователи, просматривающие эту тему: 4 Гость(ей)