Channel和ChannelPipeline 创建_(4)接受处理数据

在启动配置中的方法channel(NioServerSocketChannel.class)会创建一个ReflectiveChannelFactory并赋值给成员变量channelFactory。当调用绑定端口号方法bind(8899)

 

 

2.NioServerSocketChannel的构造函数

在构造函数中首先调用静态方法newSocket(),创建一个Java Nio ServerSocketChannel实例,它继承SelectableChannel

 

然后调用父类AbstractNioChannel的构造函数,它会持有上一步创建的ServerSocketChannel实例并赋值给变量ch,同时配置为非阻塞ch.configureBlocking(false),如下:


1. ChannelPipeline的创建

查看父类AbstractChannel可以发现,在构造函数中,创建了ChannelPipeline,并赋值给pipeline对象.

 

chanel 通过变量pipeline持有ChannelPipeline

DeflautChannelPin的构造函数接受this为参数,因此ChanelPipe也持有Channel.

 

2.ChannelPpeline的拦截过滤器模式

ChannelPipeline 中可以添加多个ChannelHander:

 

接口提供了ChannelHandler的方法,如addFirst等,removeLast()等。

ChannelPipeline是线程安全的,可以随时添加或删除ChannelHandler。

channelPIpeine 中IO事件传播靠

3.channelPipelie 中添加处理耗时任务,有2种方式:

或者在自定义Handler中使用线程池ExecutorService处理。

 

??? netty 如何接受数据呢?

读取数据本质:socketChannelImpl(java.nio.ByteUffer)

nioSocketChangnel read() 是读数据,nioserverSocketchangnel read() 是创建连接。

pipeine

 

 

??? netty  如何做业务处理呢?

多路复Ca用selector 季守东OP_READ 事件

处理OP_READ事件,NIOSocketChannel.NIOSocetchanbgnel

Hander: 执行资格:

Hander 伤心爱你了ChannelnboundHanderr

实现方法channelRead不能家注解@skip

具体给一下跟一下代码:

findContextInbound:877, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRegistered:145, AbstractChannelHandlerContext (io.netty.channel)
channelRegistered:1383, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRegistered:166, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRegistered:152, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRegistered:815, DefaultChannelPipeline (io.netty.channel)
register0:505, AbstractChannel$AbstractUnsafe (io.netty.channel)
access$200:417, AbstractChannel$AbstractUnsafe (io.netty.channel)
run:474, AbstractChannel$AbstractUnsafe$1 (io.netty.channel)
safeExecute$$$capture:164, AbstractEventExecutor (io.netty.util.concurrent)
safeExecute:-1, AbstractEventExecutor (io.netty.util.concurrent)
 - Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:828, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:818, SingleThreadEventExecutor (io.netty.util.concurrent)
register:471, AbstractChannel$AbstractUnsafe (io.netty.channel)
register:87, SingleThreadEventLoop (io.netty.channel)
register:81, SingleThreadEventLoop (io.netty.channel)
register:86, MultithreadEventLoopGroup (io.netty.channel)
initAndRegister:323, AbstractBootstrap (io.netty.bootstrap)
doBind:272, AbstractBootstrap (io.netty.bootstrap)
bind:268, AbstractBootstrap (io.netty.bootstrap)
bind:246, AbstractBootstrap (io.netty.bootstrap)
main:74, EchoServer (io.netty.example.echo)

 

处理业务本质:数据在pipeLine 中所有的hander channelRead() 执行过程

hander 要实现IO.netty.channel.channelinaINbound#changeReader(chanhelHaderContext ctx,object msg)

且不能加上注解@skip

默认处理线程就是ChannelPipeline:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值