一、HTTP服务

    • 实例要求:使用IDEA创建Netty项目
    • Netty 服务器在7000端口监听,浏览器发出请求”http://loclalhost:6668/
    • 服务器可以回复消息给客户端 “Hello!我是服务器 5”,并对特定请求资源进行过滤。
    • 目的:Netty可以做Http服务开发,并且理解Handler实例和客户端及其请求的关系。

    image.pngimage.png
    遇到的问题:
    1、编码UTF8乱码,改为UTF16即可
    2、TestServer返回2次请求。
    原因是请求了favicon:
    image.png 解决方法:
    image.png

    image.png
    Http协议用完就断掉,每次刷新都是不同的pipeline
    image.png

    二、Netty核心模块

    • Bootstrap、ServerBootstrap

    1、Bootstrap意思是引导,一个Netty 应用通常由-一个Bootstrap 开始,主要作用是配置整个Netty 程序,串联各个组件,Netty 中Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类
    2、常见的方法
    image.png

    • Future和ChannelFuture

    Netty中所有的I0操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过一会等它执行完成或
    者直接注册一个监听,具体的实现就是通过Future 和ChannelFutures, 他们可以注册一个监听,当操作执行成功
    或失败时监听会自动触发注册的监听事件。
    常见的方法有
    1、Channel channel(),返回当前正在进行I0操作的通道
    2、ChannelFuture sync(),等待异步操作执行完毕
    image.png

    • Channel

    image.png

    • Selector

    image.png

    • ChannelHandler

    image.png

    • Pipeline 和ChannelPipeline

    ChannelPipeline是一个重点:
    1) ChannelPipeline 是一个Handler 的集合,它负责处理和拦截inbound 或者outbound 的事件和操作,相当于一个贯穿Netty的链。(也可以这样理解: ChannelPipeline 是保存ChannelHandler 的List, 用于处理或拦截Channel的入站事件和出站操作)
    2) ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及Channel中各个的ChannelHandler 如何相互交互
    3)在Netty 中每个Channel 都有且仅有一个ChannelPipeline 与之对应,它们的组成关系如下
    image.png
    image.png
    image.png
    image.png
    4)常用方法
    ChannelPipeline addFirst(ChannelHandler.. handlers),把一个业务处理类(handler) 添加到链中的第一个位置
    ChannelPipeline addL ast(ChannelHandler.. handlers),把一一个业 务处理类(handler) 添加到链中的最后一 个位置

    • ChannelHandlerContext

    1) 保存Channel 相关的所有上下文信息,同时关联一个ChannelHandler 对象。
    2)即ChannelHandlerContext 中包含一个具体的事件处理器ChannelHandler,同时ChannelHandlerContext中也绑定了对应的pipeline 和Channel 的信息,方便对ChannelHandler 进行调用。
    image.png
    3)常用方法
    image.png

    • ChannelOption

    1) Netty 在创建Channel 实例后,一 般都需要设置ChannelOption 参数。
    2) ChannelOption 参数如下:
    image.png

    • EventLoopGroup 和其实现类 NioEventLoopGroup

    1) EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。
    2) EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个 EventLoop来处理任务。在 Netty 服务器端编程中,我们一般都需要提供两个 EventLoopGroup,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。
    image.png
    3)通常一个服务端口即一个 ServerSocketChannel对应一个Selector 和一个EventLoop线程。BossEventLoop 负责接收客户端的连接并将 SocketChannel 交给 WorkerEventLoopGroup 来进行 IO 处理,如下图所示:
    image.png
    image.png

    • Unpooled 类

    Netty 提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类 常用方法如下所示:
    image.png
    用法:
    image.png
    image.png

    三、Netty——群聊系统

    • 实例要求:
    • 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 实现多人群聊

    • 服务器端:可以监测用户上线,离线,并实现消息转发功能

    • 客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)

    • 目的:进一步理解Netty非阻塞网络编程机制

    • 在此基础上实现私聊的思路

    image.png

    四、Netty心跳机制

    • 实例要求
    • 编写一个 Netty心跳检测机制案例,
    • 当服务器超过3秒没有读时,就提示读空闲
    • 当服务器超过5秒没有写操作时,就提示写空闲 实现
    • 当服务器超过7秒没有读或者写操作时,就提示读写空闲

    image.png
    image.png
    问题:不停地发送心跳包
    image.pngimage.pngimage.png