Обзор Netty - Углубленное понимание Netty: жизненный цикл ChannelHandler и механизм обработки событий.
Обзор Netty - Углубленное понимание Netty: жизненный цикл ChannelHandler и механизм обработки событий.
Каталог статей
  • Обзор
  • Code
    • LifeCycleInBoundHandler
  • проверять

Обзор

NettyизChannelHandlerпредназначен для обработки сетевых событий(нравитьсяданныечитать、данныеписать、соединять Учреждать、отключаться и т.п.) основные компоненты.

В Нетти,ChannelHandlerизжизненный циклиChannelиз状态紧密相关,В основном оно включает в себя следующие этапы:

  1. Инициализация:
    • handlerAdded метод называется,Обычно это происходит, когдаChannelPipelineво время инициализации,выражать一个新изChannelHandlerбыл добавлен вChannelPipelineсередина。
  2. Регистрация:
    • channelRegistered метод называется,это означаетChannel已经成功注册到它изEventLoopначальство。
  3. Активация:
    • channelActive метод называется,выражатьChannelбыл успешно активирован,Вы можете начать получать и отправлять сообщения.
  4. Чтение данных (Чтение):
    • channelRead метод называется,это означает从Channelсерединачитать到了данные。
  5. Читать полностью:
    • channelReadComplete Вызывается метод, который указывает на завершение операции чтения.
  6. Деактивация:
    • channelInactive метод называется,выражатьChannelи远端主机失去了соединять,стал неактивным.
  7. Снятие с регистрации:
    • channelUnregistered метод называется,выражатьChannel从它изEventLoopначальство注销。
  8. Удалять:
    • handlerRemoved метод называется,выражатьChannelHandlerотChannelPipelineсередина移除。

这些方法из调用顺序иChannelиз状态转换顺序相对应,Формирование полного жизненного цикла. в практическом применении,В соответствии с различными потребностями,Разработчики могут переопределить эти методы для реализации пользовательской логической обработки.,比нравиться处理超时、захватывающая деятельность в сфере здравоохранения、кодек данных и т. д.


Code

Мы до сих пор используем Netty Review - раскрыт механизм автоматического переподключения Netty: принципы и лучшие практикииз代码演示一下 добавим обработчик на стороне сервера

Язык кода:javascript
копировать
ch.pipeline().addLast(new LifeCycleInBoundHandler());

LifeCycleInBoundHandler

Язык кода:javascript
копировать
package com.artisan.reconnect;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 *  handlerизжизненный Последовательность вызова интерфейса обратного вызова цикла:
 *  handlerAdded -> channelRegistered -> channelActive -> channelRead -> channelReadComplete
 *  -> channelInactive -> channelUnRegistered -> handlerRemoved
 *
 * handlerAdded: Вновь созданное соединение добавит обработчик в конвейер канала в соответствии со стратегией инициализации, то есть Channel.pipeline.addLast(new LifeCycleInBoundHandler) обратный вызов после завершения выполнения;
 * channelRegistered: Этот обратный вызов будет вызван, когда соединение будет назначено определенному рабочему потоку.
 * ChannelActive: Подготовка канала завершена, все конвейеры добавлены и закреплены за конкретными линиями, что свидетельствует о том, что канал готов и может использоваться.
 * ChannelRead: клиент отправляет данные на Сервер, и этот метод будет вызываться каждый раз, указывая, что данные доступны для чтения;
 * ChannelReadComplete: каждый раз, когда Сервер считывает полные данные, этот метод вызывается обратно, чтобы указать, что данные прочитаны;
 * ChannelInactive: когда соединение отключено, будет вызван этот обратный вызов, указывающий, что базовое соединение TCP в это время отключено.
 * channelUnRegistered: В соответствии с ChannelRegistered, когда соединение закрывается, связанный рабочий поток освобождается;
 * handlerRemoved: Соответствует handlerAdded, метод обратного вызова после удаления обработчика из конвейера канала.
 */
public class LifeCycleInBoundHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRegistered(ChannelHandlerContext ctx)
            throws Exception {
        System.out.println("channelRegistered: канал, зарегистрированный в NioEventLoop");
        super.channelRegistered(ctx);
    }

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("channelUnregistered: канал отвязывается от NioEventLoop");
        super.channelUnregistered(ctx);
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("channelActive: канал готов");
        super.channelActive(ctx);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("channelInactive: канал закрыт");
        super.channelInactive(ctx);
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) 
            throws Exception {
        System.out.println("channelRead: В канале есть читаемое "данные" );
        super.channelRead(ctx, msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("channelReadComplete: чтение данных канала завершено");
        super.channelReadComplete(ctx);
    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("handlerAdded: Обработчик добавляется в конвейер канала");
        super.handlerAdded(ctx);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) 
            throws Exception {
        System.out.println("handlerRemoved: Обработчик удален из конвейера канала");
        super.handlerRemoved(ctx);
    }
}

В Netty жизненный цикл ChannelHandler тесно связан со статусом Channel, который в основном включает в себя следующие методы обратного вызова:

  1. handlerAdded: Вызывается, когда в ChannelPipeline добавляется новый ChannelHandler.
  2. channelRegistered: Вызывается, когда канал успешно зарегистрирован в EventLoop.
  3. channelActive: Вызывается, когда канал активирован и может начать получать и отправлять сообщения.
  4. channelRead: Вызывается, когда данные читаются из канала.
  5. channelReadComplete: Вызывается после завершения операции чтения.
  6. channelInactive: Вызывается, когда канал становится неактивным.
  7. channelUnregistered: Вызывается, когда канал выходит из EventLoop.
  8. handlerRemoved: Вызывается, когда ChannelHandler удаляется из ChannelPipeline.

Выше приведены основные методы обратного вызова жизненного цикла Netty ChannelHandler. Разработчики могут переписать эти методы по мере необходимости для реализации пользовательской логической обработки.


проверять

Клиент устанавливает соединение и завершает взаимодействие с помощью сообщения.

Клиент отключается

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.