1. Что такое канал?
Канал очень легко понять по его буквальному значению, то есть «труба». Для подачи воды в тысячи домохозяйств нужны трубопроводы, для отопления тоже нужны трубопроводы, для связи по сети тоже нужны трубопроводы, этот трубопровод наш.Socket. Мы выяснили, что в водопроводе циркулирует водопроводная вода, а в трубе отопления циркулирует отопление, тоSocketВ обращении находится наш поток байтов.
Сказав так много, что такое Канал? Редактор понимает, что Канал должен подключаться к сетевому сокету и иметьread, write, connect, and bindКанал компонентов возможностей.
Канал обычно имеет следующие свойства:
- 1. Состояние компонента самого Канала, например, открыт ли он
openстатус, он подключенconnectedусловие - 2. За самим каналом будет следовать
ChannelConfigобъект, связанный сChannelнастроить, например接收缓冲区的大小 - 3. За самим каналом будет следовать
ChannelPipelineАссоциация объектов, используемая для обработки событий ввода-вывода.events
в НеттиChannelДополнительные операции инкапсулированы на основе Java NIO. В Netty все операции ввода/вывода являются асинхронными. Это означает, что мы не можем получить результат операции ввода-вывода сразу после вызова операции ввода-вывода, поэтому Netty предоставляетChannelFuture, который возвращается после каждого вызова асинхронного ввода-вывода.
В Netty Channel имеет структуру наследования, мы можем вызвать Channel'sparent()способ получения,parent()Возврат метода зависит от того, как был создан канал. напримерSocketChannelпоServerSocketChannelполучить, поэтому при вызовеSocketChannelизparent()метод вернетServerSocketChannel
Каждый раз при обработке операции Channel мы должны явно вызывать ееclose()а такжеclose(ChannelPromise)Освобождение ресурсов, это гарантирует, что все ресурсы будут освобождены правильно~
2. Какие есть типы каналов в Netty? Каков эффект каждого?
В общем, разные протоколы и разные способы использования соответствуют разным типамChannel. размещен нижеChannelДиаграмма наследования интерфейса:
- 1,
UnixChannel: этот тип канала предоставляет доступ только к некоторым операциям, доступным только в Unix-подобных операционных системах. - 2,
DatagramChannel: обработкаUDP/IPКанал протокола - 3.
DuplexChannel: Полнодуплексный канал с двумя конечными точками, которые могут быть закрыты независимо в каждой конечной точке. - 4.
Http2StreamChannel:служба поддержкиHTTP/2Канал протокола - 5.
SctpChannel: обработкаSCTP/IPКанал протокола - 6.
ServerChannel: компонент канала, который получает новые соединения, а затем создает дочерние каналы,ServerSocketChannelхороший пример,ServerSocketChannelпринять соединение, затем создатьSocketChannel
3. Связь между Channel и EventLoopGroup и EventLoop в Netty
ОдинEventLoopЭто простой поток, используемый для обработки всех зарегистрированных в нем событий ввода-вывода, то есть канал должен быть зарегистрирован в EventLoop, аEventLoopОбычно их несколькоChannelзарегистрирован, покаEventLoopGroupявляетсяEventLoopколлекция.
В-четвертых, в НеттиEventLoopОжидание диаграммы наследования компонентов потока событий
Xiaobian опубликовал простую диаграмму наследования, как показано ниже:
На самом деле, из рисунка видно, что модель многопоточности в Netty — это, по сути,EventExecutorGroup,EventExecutorGroupУнаследовано от JDKScheduledExecutorServiceинтерфейс, поэтому в Netty мы можем использовать его для выполнения некоторых настроек, таких как задачи синхронизации.
- 1,
EventExecutorGroup: отвечает за передачуnext()способ создания серииEventExecutor, кроме того, также отвечает за управление его созданиемEventExecutorЖизненный цикл и предоставить метод глобального отключения. - 2,
EventLoopGroupэто особыйEventExecutorGroup, в основном используется для регистрацииChannelдля последующего использования в цикле событий - 3.
EventExecutorэто особыйEventExecutorGroup, который предоставляет несколько удобных методов для определения того, находится ли поток вEnentLoopвыполнить в - 4.
MultithreadEventExecutorGroupКак следует из названия, он позволяет выполнять задачи в несколько потоков.
Пять, в НеттиBootstrapсемья
На самом деле в НеттиBootstrapСемейство классов запуска не очень большое, оно эквивалентно классу инструментов!Bootstrapа такжеServerBootstrapотносительно второй главы вышеServerChannelВсего категорий три, диаграмма классов выглядит следующим образом:
- 1,
Bootstrap: используется для открытия канала для клиентаChannel,как правилоbind()метод используется для создания ссылки без сохранения состояния на основе UDP, для обычной ссылки TCP мы используем егоconnect()создание метода - 2,
ServerBootStrap: используется для открытияServerChannel
Шесть, в НеттиChannelHandler
ChannelHandlerМожет использоваться для обработки событий ввода-вывода или для получения операций ввода-вывода и указывает указатель наChannelPipelineследующий вHandler. вChannelPipelineзаChannelHandlerПредоставляется контейнер.
ChannelInboundHandlerиспользуется для состояния (open close connect) изменяется, чтобы установить соответствующее действие обратного вызова, короче говоря,ChannelInboundHandlerперехватывать и обрабатывать входящие события,ChannelOutboundHandlerПерехват и обработка исходящих событий.