Netty入门

这篇具有很好参考价值的文章主要介绍了Netty入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Netty

什么是Netty
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端

注意:netty的异步还是基于多路复用的,并没有实现真正意义上的异步IO

Netty的优势

如果使用传统NIO,其工作量大,bug 多

  • 需要自己构建协议
  • 解决 TCP 传输问题,如粘包、半包
  • 因为bug的存在,epoll 空轮询导致 CPU 100%

Netty 对 API 进行增强,使之更易用,如

  • FastThreadLocal => ThreadLocal
  • ByteBuf => ByteBuffer
入门案例

服务器端代码

package com.vmware.netty.utils.s1;

import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;

public class HelloServer {
    public static void main(String[] args) {
        new ServerBootstrap()//启动器,负责组装netty组件,启动服务器
                //包含BossEventLoop WorkerEventLoop =>EventLoop指的(selector+thread)
                .group(new NioEventLoopGroup())
                .channel(NioServerSocketChannel.class) //服务器的ServerSocketChannel实现
                // boss负责处理连接   worker负责处理读写  决定了worker(child)能执行哪些操作(handler)
                .childHandler(
                        // channel代表与客户端的数据读写通道  Initializer初始化,负责添加别的handler
                        new ChannelInitializer<NioSocketChannel>() {
                    @Override  //连接建立后调用方法
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        nioSocketChannel.pipeline().addLast(new StringDecoder());//将bytebuf转为字符串
                        nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter() {//自定义handler
                            @Override //处理读事件
                            public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                System.out.println(msg);
                            }
                        });
                    }
                    //绑定服务端口
                }).bind(9001);
        System.out.println("server started ...");
    }
}

客户端代码

public class HelloClient {
    public static void main(String[] args) throws InterruptedException {
        //启动类
        new Bootstrap()
                //添加EventLoop
                .group(new NioEventLoopGroup())
                //选择客户端channel实现
                .channel(NioSocketChannel.class)
                //添加处理器
                .handler(new ChannelInitializer<NioSocketChannel>() {
                    @Override //在连接建立后被调用
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        nioSocketChannel.pipeline().addLast(new StringEncoder());
                    }
                })
                //连接到服务器
                .connect(new InetSocketAddress("localhost",9001))
                .sync()
                //向服务器发送数据
                .channel().writeAndFlush("hello,netty");
    }
}

执行流程

Netty入门

为什么服务器端使用childHandler添加组件而客户端使用handler方法添加组件?

  • ServerBootstrap的handler方法用于为bossGroup添加组件,而childHander用于为workerGroup添加组件
  • 而Bootstrap只有handler方法,主要原因是客户端不需要处理accept event,不存在boss与worker的区分

组件解释文章来源地址https://www.toymoban.com/news/detail-407257.html

  • 把 channel 理解为数据的通道
  • 把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过 pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf
  • 把 handler 理解为数据的处理工序
    • 工序有多道,合在一起就是 pipeline,pipeline 负责发布事件(读、读取完成…)传播给每个 handler, handler 对自己感兴趣的事件进行处理(重写了相应事件处理方法)
    • handler 分 Inbound 和 Outbound 两类
  • 把 eventLoop 理解为处理数据的工人
    • 工人可以管理多个 channel 的 io 操作,并且一旦工人负责了某个 channel,就要负责到底(绑定)
    • 工人既可以执行 io 操作,也可以进行任务处理,每位工人有任务队列,队列里可以堆放多个 channel 的待处理任务,任务分为普通任务、定时任务
    • 工人按照 pipeline 顺序,依次按照 handler 的规划(代码)处理数据,可以为每道工序指定不同的工人

到了这里,关于Netty入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Netty入门

    Netty入门

    什么是Netty Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 注意: netty的异步还是基于多路复用的,并没有实现真正意义上的异步IO Netty的优势 如果使用传统NIO,其工作量大,bug 多 需要自己构建协议 解决 TCP 传输问题,

    2023年04月09日
    浏览(7)
  • Netty入门学习和技术实践

    Netty入门学习和技术实践

    BIO: BIO原理图: AIO: AIO原理图: NIO: NIO原理图: IO多路复用 IO多路复用原理图 总结: 增进理解: Netty 的工作架构图 Selector 选择器原理 netty几大核心概念 : 拆包/粘包 : netty处理 拆包/粘包 的方式: 零拷贝: 项目学习地址: Netty教程:十二个实例带你轻松学习Netty 项目代

    2024年02月10日
    浏览(9)
  • 在JavaScript中,什么是浏览器事件循环(browser event loop)?

    在JavaScript中,什么是浏览器事件循环(browser event loop)?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月07日
    浏览(16)
  • Java NIO 和 Netty快速入门

    Java NIO 和 Netty快速入门

    channel 是读写数据的双向通道,可以从 channel将数据读入buffer,也可以将buffer数据写入channel(较之前的stream要么是输入,要么是输出更为底层) 四种常见Channel: FileChannel DatagramChannel SocketChannel ServerSocketChannel buffer用来缓冲读写数据 常见buffer: ByteBuffer MappedByteBuffer DirectByteBuffer

    2024年02月22日
    浏览(10)
  • Server-Sent Events(SSE) 入门、原理、介绍、类ChatGpt流式输出实现

    一、引言 在现代Web应用程序中,实时数据传输和实时通信变得越来越重要。为了实现这种实时通信,多种技术应运而生,如WebSocket、长轮询和Server-Sent Events(SSE)。在本文中,我们将重点探讨Server-Sent Events,一种基于HTTP的实时通信协议。 二、技术背景 Server-Sent Events(SSE)它

    2024年02月08日
    浏览(14)
  • 什么是网络取证(Network Forensics)

    什么是网络取证(Network Forensics)

    企业采用新技术来检查其网络安全是否存在零日漏洞,与立即指示问题的物理层不同,黑客攻击尝试可能会被忽视并变得严重,直到对网络流量有一个整体的可见性。通过实时监控来跟踪其源和目标的流量,以查明问题或潜在问题的根源。 网络取证(network forensics)是抓取、

    2024年02月10日
    浏览(11)
  • 到底什么是Java AIO?为什么Netty会移除AIO?一文搞懂AIO的本质!

    到底什么是Java AIO?为什么Netty会移除AIO?一文搞懂AIO的本质!

    关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论Java BIO和Java NIO这两者,而关于Java AIO的文章就少之又少了( 即使用也只是介绍了一下概念和代码示例 )。 在深入了解AIO之前,我注意到以下几个现象: 1) 2011年Java 7发布,它增加了

    2024年02月10日
    浏览(16)
  • 网络编程的无冕之王-Netty入门和核心组件介绍

    网络编程的无冕之王-Netty入门和核心组件介绍

    最近我在研究Netty,之前只是经常听说,并没有实际做过研究,为什么突然要好好研究一下它,主要是因为前段时间,我在看RocketMQ底层原理的时候发现它的底层的网络通信都是基于Netty,然后网上一查,果然,大家太多的耳熟能详的工具组件,都是基于Netty做的开发。大家看

    2024年02月10日
    浏览(8)
  • 聊聊分布式架构06——[NIO入门]简单的Netty NIO示例

    聊聊分布式架构06——[NIO入门]简单的Netty NIO示例

    目录 Java NIO和Netty NIO比较 Java NIO: Netty: Netty NIO中的主要模块 Transport(传输层) Buffer(缓冲区) Codec(编解码器) Handler(处理器) EventLoop(事件循环) Bootstrap和Channel(引导和通道) Future和Promise(异步编程) Netty示例 服务端时序图 服务端代码 客户端时序图 客户端代码

    2024年02月07日
    浏览(25)
  • 【 基于Netty实现聊天室聊天业务学习】第4节.什么是BIO与NIO

    【 基于Netty实现聊天室聊天业务学习】第4节.什么是BIO与NIO

    IO在读写的时候是阻塞的,无法做其他操作,并发处理能力的非常低,线程之间访问资源通信时候也是非常耗时久,依赖我们的网速,带宽。 我们看一下他的白话原理 我们来看一下这张图那么这张图的话它里面有一个server还有三个客户端那么客户端的话它可以有很多,那么我

    2024年04月26日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包