终结全网!手写Netty面试题答案(下)

简介: 终结全网!手写Netty面试题答案

canceled key

启动程序,客户端发起连接请求,然后点击断开连接

image.png


报错如下:

image.png


因为点击断开连接时,是会产生一个读事件请求,而这时会将该 channel 关闭    

image.png


这里加一行即可

image.png



pipeline

我们需要将业务代码抽出来,给业务开发人员使用。基本上开发人员只需要写各个编解码器即可。


package io.netty.example.helloworld;
import lombok.extern.slf4j.Slf4j;
/**
 * @author JavaEdge
 * @date 2021/5/28
 */
@Slf4j
public class MyHandler2 implements Handler {
    @Override
    public void channelRead(HandlerContext ctx, Object msg) {
        // 上一个处理器解码成 String 了,所以这里直接转型处理 String
        String string = (String) msg;
        // 处理业务
        log.debug(string);
        // 传给 handler2
        ctx.getMyChannel().doWrite("hello client");
        if ("flush".equals(string)) {
            /**
             * 这样调用,会跳过而不调用 handler2 的 flush 方法
             * 若还需要调用 handler2 的 flush 方法,应该通过 channel 调用:
             *          ctx.getMyChannel().flush();
             */
            ctx.flush();
        }
    }
    @Override
    public void write(HandlerContext ctx, Object msg) {
        log.debug("msg=" + msg);
        msg += "!!!";
        // 传递给 handler1
        ctx.write(msg);
    }
    @Override
    public void flush(HandlerContext ctx) {
        log.debug("flush");
        // 调用 handler1
        ctx.flush();
    }
}
package io.netty.example.helloworld;
import lombok.extern.slf4j.Slf4j;
import java.nio.ByteBuffer;
/**
 * @author JavaEdge
 * @date 2021/5/28
 */
@Slf4j
public class PipeLine {
    private MyChannel myChannel;
    private EventLoop eventLoop;
    HandlerContext headCtx;
    HandlerContext tailCtx;
    public PipeLine(MyChannel myChannel, EventLoop eventLoop) {
        this.myChannel = myChannel;
        this.eventLoop = eventLoop;
        PileLineHandler pileLineHandler = new PileLineHandler();
        this.headCtx = new HandlerContext(pileLineHandler, myChannel);
        this.tailCtx = new HandlerContext(pileLineHandler, myChannel);
        // 构建初始化的链表
        this.headCtx.next = this.tailCtx;
        this.tailCtx.prev = this.headCtx;
    }
    class PileLineHandler implements Handler {
        @Override
        public void channelRead(HandlerContext ctx, Object msg) {
            log.debug(msg.toString());
            log.info("tail handler" + msg);
        }
        /**
         * 因为写数据是从后往前处理,所以最终到该处理器,必须要调用 channel 执行底层的写数据到 socket
         */
        @Override
        public void write(HandlerContext ctx, Object msg) {
            log.debug(msg.toString());
            // 既然是写底层,那就必须是 ByteBuffer 类型
            if (!(msg instanceof ByteBuffer)) {
                throw new RuntimeException("error class type" + msg.getClass());
            }
            // 类型符合,则加入到 channel 的缓冲区队列
            PipeLine.this.myChannel.addWriteQueue((ByteBuffer) msg);
        }
        /**
         * 上边的 write 方法也只是将数据写到 channel 的临时缓冲区队列,并没有真正写进socket 输出
         * 当客户端调用了 flush 才真正的写数据出去。
         */
        @Override
        public void flush(HandlerContext ctx) {
            log.debug("flush");
            // 最后是由 pipeline 和 channel 交互写的数据
            PipeLine.this.myChannel.doFlush();
        }
    }
    /**
     * 仅演示添加到链尾
     *
     * @param handler
     */
    public void addLast(Handler handler) {
        HandlerContext ctx = new HandlerContext(handler, myChannel);
        HandlerContext prev = this.tailCtx.prev;
        prev.next = ctx;
        ctx.prev = prev;
        ctx.next = this.tailCtx;
        tailCtx.prev = ctx;
    }
}
目录
相关文章
|
5月前
|
Dubbo 网络协议 NoSQL
阿里巴巴的Netty面试题到底有多难,这些知识你能掌握多少?
Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。
|
3月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
49 1
|
5月前
|
设计模式 监控 网络协议
Netty面试题
Netty面试题
|
12月前
|
存储 NoSQL Redis
redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)(下)
redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)
|
12月前
|
存储 SQL JSON
redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)(上)
redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)
|
XML JSON 网络协议
Netty相关面试题汇总
Netty相关面试题汇总
109 0
|
XML 存储 JSON
JAVA面试——Netty 与 RPC(二)
JAVA面试——Netty 与 RPC
100 0
JAVA面试——Netty 与 RPC(二)
|
XML 编解码 弹性计算
JAVA面试——Netty 与 RPC(一)
JAVA面试——Netty 与 RPC
177 0
JAVA面试——Netty 与 RPC(一)
|
网络协议 Java Linux
48. 盘点Netty面试常问考点:什么是 Netty 的零拷贝?
48. 盘点Netty面试常问考点:什么是 Netty 的零拷贝?
109 0
48. 盘点Netty面试常问考点:什么是 Netty 的零拷贝?
终结全网!手写Netty面试题答案(中)
终结全网!手写Netty面试题答案
69 0
终结全网!手写Netty面试题答案(中)