Netty

Netty - это java библиотека и АPI для  написание concurrent сетевых приложений.
Netty:
Асинхронный ввод/вывод (неблокирующий) - основной поток не блокируется при вводе или выводе, а продолжает работать не ожидая результата (синхронизации с клиентом).
Event-driven - (событийно-ориентированный) - выполнения программы определяется событиями (сообщениями других приложений, потоков). Два основных действия прослеживается: выборка события и его обработка.

Основным и самым низким объектом в Netty является ChannelBuffer ( по которому передаются массив байтов).  Более абстрактным понятием есть Сhannel.
Все методы в Сhannel делятся на две категории:
- простые атрибутные методы (синхронные), которые предоставляют информацию о текущем канале
- асинхронные методы, типа I/O операции: bind, write, disconnect. Эти методы возврщают ChannelFuture (отложенный результат)

Создание каналов соединений:
Каналы не создаются не на прямую, а через фабрики.

Фабрика каналов (TCP) требует в конструкторе два вида Thread пулов или Executors (аналог thread):
1. Boss потоки: создает, прослушивает соединения (bind/connect). Дальше передает управление рабочим потокам. Со стороны сервера может быть только один босс поток на один прослушиваемый сокет.
2. Worker потоки: выполняют асинхронный іnput/output.

Чистый Channel может работать только с СhannelBuffer. Для обработки других сложных объектов  в Channel есть ChannelPipeLine (трубопровод), который состоит из специальных обработчиков (СhannelHandler). PipeLine имеет строгий порядок и вначале он к первому обработчику всегда приходит СhannelBuffer (байты почти в чистом виде).

В большинстве случаев Handlers используются как кодеры и декодеры:
Encoder (кодер) - конвертирует объект в СhannelBuffer или в другой тип понятный для следущего обработчика. (например ObjectEncoder  конвертирует java объект в СhannelBuffer).
Decoder (декодер) - конвертирует СhannelBuffer в другой более полезный объект.



Все хендлеры деляется на две большие группы :
ChannelDownstreamHandler (outBound) - вызываются, когда сообщение идет от сервера.
ChannelUpstreamHandler (inBound) - вызываются, когда сообщение идет к серверу.

HttpServerCoder - пример duplex хендлера, который при Upstream работает как HttpRequstDecoder (преобразует ByteBuff в HttpRequest), downstream - HttpResponseEncoder (преобразует HttpResponse в ByteBuf).

Как добавлять обработчики. Имя (name) можно не указывать (имя произвольное).

ChannelPipeline p = ch.pipeline();
p.addLast(new HttpServerCodec());
p.addLast(new HttpServerHandler());


Комментариев нет:

Отправить комментарий