Обзор 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose