本文为下文姊妹篇
https://editor.csdn.net/md/?articleId=108848924
尚硅谷2019年Netty教程 netty handler链调用机制 ----目标netty—step5.40
增加内容
=服务端
01 服务端的 类 MyServerHandler 读取数据方法 channelRead0
在收到客户端发送过来的数据后,写数据到 ByteBuf 中
ctx.writeAndFlush(98765L);
02 所以需要在 类 MyServerInitializer 的方法 initChannel
中增加响应的 出站的handler ,对写向client的数据(98765)进行 编码 ,然后发送
pipeline.addLast(new MyLongToByteEncoder());
=客户端
03 客户端类 MyClientHandler 增加 读取数据的 方法 channelRead0
public class MyClientHandler extends SimpleChannelInboundHandler {
@Override
protected void channelRead0(ChannelHandlerContext ctx, Long msg) throws Exception {
System.out.println("======= step06 服务器ip: "+ ctx.channel().remoteAddress()+ " 服务器消息 : "+ msg);
}
04 因为需要读取数据,所以需要在管道中增加 byteToLong的解码方法
MyClientInitializer initChannel
//这是一个入栈的解码器 handler
pipeline.addLast(new MyByteToLongDecoder());
handler链调用机制示例
https://www.bilibili.com/video/BV1jK4y1s7GV?p=79
https://www.bilibili.com/video/BV1jK4y1s7GV?p=80
https://www.bilibili.com/video/BV1jK4y1s7GV?p=81
https://www.bilibili.com/video/BV1jK4y1s7GV?p=82
https://www.bilibili.com/video/BV1jK4y1s7GV?p=83
socket --> channel -->入栈
channel --> socket --> 出栈
(server)解码器–ProtobufDecoder : MessageToMessageDecoder : ChannelInboundHandlerAdapter
(client)编码器–ProtobufEncoder : MessageToMessageEncoder : ChannelOutboundHandlerAdapter : ChannelHandlerAdapter : ChannelHandler (I)
ByteToMessageDecoder
ByteToMessageDecoder 会对入栈数据进行缓冲,直到它准备好处理。
服务端的channelpipeline接收到客户端通过socket传过来的数据,解析
ToIntegerDecoder
当没有更多元素添加到List的时候,它的内容将会被发送给下一个ChannelInBoundHandler.
读数据(encoder)的顺序
socket channelPipeline
二进制数据 <-- ToIntegerDecoder --> 业务处理器 ChannelInboundHandlerAdapter —>---|
二进制数据 <-- ToIntegerEncoder <-- 业务处理器 ChannelOutboundHandlerAdapter —<---|
==========================客户端代码 ======================================
package com.atguigu.inboundhandlerandoutboundhandler.client;
import com.sun.corba.se.impl.orbutil.concurrent.Sync;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
/**
* Author: tz_wl
* Date: 2020/9/28 15:50
* Content:
*/
public class MyClient {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new MyClientInitializer());
ChannelFuture channelFuture = bootstrap.connect("localhost", 8087).sync