当前位置:首页 > 实用技巧 >

怎么写netty(netty入门教程文档)

来源:原点资讯(m.360kss.com)时间:2024-02-21 13:34:19作者:YD166手机阅读>>

思维导图

怎么写netty,netty入门教程文档(1)

前言

本文主要讲述netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。

一、Netty概述

官方的介绍:

Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients.

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

二、为什么使用Netty

从官网上介绍,Netty是一个网络应用程序框架,开发服务器和客户端。也就是用于网络编程的一个框架。既然是网络编程,Socket就不谈了,为什么不用NIO呢?

2.1 NIO的缺点

对于这个问题,之前我写了一篇文章《NIO入门》对NIO有比较详细的介绍,NIO的主要问题是:

  • NIO的类库和API繁杂,学习成本高,你需要熟练掌握Selector、ServerSocketchannel、SocketChannel、ByteBuffer等。
  • 需要熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序。
  • 臭名昭著的epoll bug。它会导致Selector空轮询,最终导致CPU 100%。直到JDK1.7版本依然没得到根本性的解决。

2.2 Netty的优点

相对地,Netty的优点有很多:

  • API使用简单,学习成本低。
  • 功能强大,内置了多种解码编码器,支持多种协议。
  • 性能高,对比其他主流的NIO框架,Netty的性能最优。
  • 社区活跃,发现BUG会及时修复,迭代版本周期短,不断加入新的功能。
  • Dubbo、Elasticsearch都采用了Netty,质量得到验证。
三、架构图

怎么写netty,netty入门教程文档(2)

上面这张图就是在官网首页的架构图,我们从上到下分析一下。

绿色的部分Core核心模块,包括零拷贝、API库、可扩展的事件模型。

橙色部分Protocol Support协议支持,包括Http协议、webSocket、SSL(安全套接字协议)、谷歌Protobuf协议、zlib/gzip压缩与解压缩、Large File Transfer大文件传输等等。

红色的部分Transport Services传输服务,包括Socket、Datagram、Http Tunnel等等。

以上可看出Netty的功能、协议、传输方式都比较全,比较强大。

四、永远的Hello Word

首先搭建一个HelloWord工程,先熟悉一下API,还有为后面的学习做铺垫。以下面这张图为依据:

怎么写netty,netty入门教程文档(3)

4.1 引入Maven依赖

使用的版本是4.1.20,相对比较稳定的一个版本。

<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.20.Final</version> </dependency>

4.2 创建服务端启动类

public class MyServer { public static void main(String[] args) throws Exception { //创建两个线程组 boosGroup、workerGroup EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { //创建服务端的启动对象,设置参数 Serverbootstrap bootstrap = new ServerBootstrap(); //设置两个线程组boosGroup和workerGroup bootstrap.group(bossGroup, workerGroup) //设置服务端通道实现类型 .channel(NioServerSocketChannel.class) //设置线程队列得到连接个数 .option(ChannelOption.SO_BACKLOG, 128) //设置保持活动连接状态 .childOption(ChannelOption.SO_KEEPALIVE, true) //使用匿名内部类的形式初始化通道对象 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { //给pipeline管道设置处理器 socketChannel.pipeline().addLast(new MyServerHandler()); } });//给workerGroup的EventLoop对应的管道设置处理器 System.out.println("java技术爱好者的服务端已经准备就绪..."); //绑定端口号,启动服务端 ChannelFuture channelFuture = bootstrap.bind(6666).sync(); //对关闭通道进行监听 channelFuture.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }

4.3 创建服务端处理器

/** * 自定义的Handler需要继承Netty规定好的HandlerAdapter * 才能被Netty框架所关联,有点类似SpringMVC的适配器模式 **/ public class MyServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //获取客户端发送过来的消息 ByteBuf byteBuf = (ByteBuf) msg; System.out.println("收到客户端" ctx.channel().remoteAddress() "发送的消息:" byteBuf.toString(CharsetUtil.UTF_8)); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { //发送消息给客户端 ctx.writeAndFlush(Unpooled.copiedBuffer("服务端已收到消息,并给你发送一个问号?", CharsetUtil.UTF_8)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { //发生异常,关闭通道 ctx.close(); } }

4.4 创建客户端启动类

public class MyClient { public static void main(String[] args) throws Exception { NioEventLoopGroup eventExecutors = new NioEventLoopGroup(); try { //创建bootstrap对象,配置参数 Bootstrap bootstrap = new Bootstrap(); //设置线程组 bootstrap.group(eventExecutors) //设置客户端的通道实现类型 .channel(NioSocketChannel.class) //使用匿名内部类初始化通道 .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { //添加客户端通道的处理器 ch.pipeline().addLast(new MyClientHandler()); } }); System.out.println("客户端准备就绪,随时可以起飞~"); //连接服务端 ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6666).sync(); //对通道关闭进行监听 channelFuture.channel().closeFuture().sync(); } finally { //关闭线程组 eventExecutors.shutdownGracefully(); } } }

4.5 创建客户端处理器

public class MyClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { //发送消息到服务端 ctx.writeAndFlush(Unpooled.copiedBuffer("歪比巴卜~茉莉~Are you good~马来西亚~", CharsetUtil.UTF_8)); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //接收服务端发送过来的消息 ByteBuf byteBuf = (ByteBuf) msg; System.out.println("收到服务端" ctx.channel().remoteAddress() "的消息:" byteBuf.toString(CharsetUtil.UTF_8)); } }

4.6 测试

先启动服务端,再启动客户端,就可以看到结果:

MyServer打印结果:

怎么写netty,netty入门教程文档(4)

栏目热文

netty 怎么通信(netty怎么维护长连接)

netty 怎么通信(netty怎么维护长连接)

摘自 rickiyang 51CTO技术栈 很早以前就写过关于 Netty 的使用,最近发现还有网友在看之前写的那篇 N...

2024-02-21 13:23:06查看全文 >>

netty怎么设置网络通信(netty怎么设置自定义协议)

netty怎么设置网络通信(netty怎么设置自定义协议)

一、步骤概览二、步骤说明1. 引入依赖包说明:Netty-all:netty-all 是 Netty 的一个打包模块,包...

2024-02-21 13:46:07查看全文 >>

五菱小卡怎么看出国五还是国6(五菱小卡国五好还是国六好)

五菱小卡怎么看出国五还是国6(五菱小卡国五好还是国六好)

【卡车之家 原创】“地摊经济”走红之后,自主创业似乎又多了一个新的选择。但工欲善其事必先利其器,没有好的装备怎么能行?能...

2024-02-21 13:49:36查看全文 >>

去年买的五菱新卡是国五还是国六(五菱新卡国5和国6相差多少钱)

去年买的五菱新卡是国五还是国六(五菱新卡国5和国6相差多少钱)

五菱荣光新卡车身尺寸方面,五菱荣光新卡长宽高分别为5220/1760/1900mm,轴距为3350mm,单排车型货厢尺寸...

2024-02-21 13:26:36查看全文 >>

五菱新卡国五和国六哪个省油(五菱新卡国六a和国六b有什么区别)

五菱新卡国五和国六哪个省油(五菱新卡国六a和国六b有什么区别)

如今大家对生活品质有了更高的追求,很多人都不再甘于一份朝九晚五的工作,开始尝试自主创业。对于创业人群来说,选择一款合适的...

2024-02-21 13:34:49查看全文 >>

netty大文件传输框架(netty大文件上传)

netty大文件传输框架(netty大文件上传)

今天我们来完成一个使用netty进行文件传输的任务。在实际项目中,文件传输通常采用FTP或者HTTP附件的方式。事实上通...

2024-02-21 13:48:27查看全文 >>

netty文件传输(netty传输二进制文件)

netty文件传输(netty传输二进制文件)

本系列Netty源码解析文章基于 4.1.56.Final版本主从Reactor组完整结构.png在?《Netty如何高...

2024-02-21 13:35:28查看全文 >>

netty 文件分发(netty详细步骤)

netty 文件分发(netty详细步骤)

一、异步非阻塞通信1.1 传统BIO1.2 非阻塞NIO1.3 拓展:AIO1.4 I/O多路复用机制1.4.1 sel...

2024-02-21 13:52:34查看全文 >>

怎么集成netty(netty操作原理)

怎么集成netty(netty操作原理)

Gateway和Netty都有盲区的感觉;一、Netty简介Netty是一个异步的,事件驱动的网络应用框架,用以快速开发...

2024-02-21 13:37:42查看全文 >>

为什么要学习netty(netty有必要学吗)

为什么要学习netty(netty有必要学吗)

2021年了,终于开始系统性总结Netty相关的东西了。这会是Netty系列的第一篇,我想先聊聊 “为什么要学习Nett...

2024-02-21 13:41:47查看全文 >>

文档排行