Netty学习笔记01--出入站处理器顺序

1.注册顺序影响事件的触发

例如在入站处理器的channelActive() 中调用出站处理器中的write(),如果出站处理器在入站处理器之后注册,则·write()`不会被触发。

// channelActive()中调用ctx.write()
ch.pipeline().addLast(new InHandler01());
ch.pipeline().addLast(new OutHandler01());// write()不会触发
ch.pipeline().addLast(new OutHandler02());// write()不会触发

2.入站执行遵循FIFO、出站执行则FILO

入站的处理器遵循配置顺序,先注册,先执行;
出站的处理器执行顺序则是先注册,后执行。

protected void initChannel(SocketChannel ch) throws Exception {
	ch.pipeline().addLast(new StringEncoder());
    ch.pipeline().addLast(new OutHandler01());
    ch.pipeline().addLast(new OutHandler02());
    ch.pipeline().addLast(new InHandler01());
    ch.pipeline().addLast(new InHandler02());
}

仅在InHandler01的channelActive中调用 ctx.write()。与服务端连接后,触发了入站处理器的channelRegisteredchannelActive。可以看到:

  • 入站处理器执行顺序遵循配置,出站处理器则相反
----终端输出:
inHandler01 channelRegistered
inHandler02 channelRegistered
OutHandler02 connect
OutHandler01 connect
inHandler01 channelActive
OutHandler02 write			
OutHandler02 msg: hello			//此处调用flush
OutHandler01 write
OutHandler01 msg: helloworld
OutHandler01 flush			// 执行了OutHandler01
inHandler02 channelActive

3.只会触发最后一个出站处理器的flush方法

仅在OutHandler02的write()方法中调用ctx.flush()。根据上面的终端输出可以看到,仅执行了最后一个出站处理器的flush()

4.通信端的消息编解码需保持逻辑一致

// 客户端发送消息,使用String编码
ch.pipeline().addLast(new StringEncoder());

// 服务端使用String解码
ch.pipeline().addLast(new StringDecoder());
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值