初识Netty

我们已经了解了Socket通信/IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识,其实我们之前所学习的仅仅是一个模型,如果想把这些真正的用于实际工作中去,其实我们之前所学习的仅仅是一个模型,如果想把这些真正的用于实际工作中去,那么还需要不断的完善、扩展和优化。比如很经典的TCP读包写包问题,或者是数据接收的大小,实际的用心读取与应答的处理逻辑等一些细节问题需要我们认真的去思考,而这些我们都需要大量的时间和经历,以及丰富的经验。所以想学好socket通信不是件容易的事情,那么现在,我们就要学习一门新的技术Netty,我们为什么选择Netty,原因无他,简单!我们再也不必去编写复杂的代码逻辑去实现通信,我们再也不需要去考虑性能为题,不需要考虑编码问题,半包读写问题等,这些强大的Netty已经帮我们实现好了,我们只需要使用即可。

Netty是也就最留下的NIO框架,他的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、以及我们之后学习的JMS框架,强大的RocketMQ、还要主流的分布式通信框架Dubbox等等。

Netty是基于Java NIO的网络应用框架。

Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。Netty的内部实现是很复杂的,但是Netty提供了简单易用的api从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。

网络应用程序通常需要有较高的可扩展性,无论是Netty还是其他的基于Java NIO的框架,都会提供可扩展性的解决方案。Netty中一个关键组成部分是它的异步特性,下面将讨论同步(阻塞)和异步(非阻塞)的IO来说明为什么使用异步代码来解决扩展性问题以及如何使用异步。

Netty架构组成

Netty特性

下面开始看一个入门代码,在用Netty之前,回顾下NIO通信步骤:

1.创建ServerSocketChannel,为它配置非阻塞模式

2.绑定监听,配置TCP参数,录入bacllog大小等

3.创建一个独立的IO线程,用户轮询多路复用器Selector

4.创建Selector,将之前创建的ServerSocketChannel注册到Selector上,并设置监听标识位

5.启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道

6.当轮询到了处于就绪的通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则调用accept方法接受新的客户端。

7.设置新接入客户端的一些参数,如非阻塞、并将其通道继续注册到Selector之中,设置监听标识位等

8.如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等

9.更细节的还要数据没法送完成继续发送的问题。。。

一个简单的NIO服务器端程序,就是如此的复制,下面看一下Netty完成这件事情需要的步骤:

Netty实现通信的步骤:

1.创建两个NIO线程组,一个专门用于网络事件处理(接受客户端的连接),另一个则进行网络通信读写。

2.创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等等。

3.创建一个实际处理数据的类Channellnitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式、已经实际处理数据的接口。

4.绑定端口,执行同步阻塞方法等待服务器端启动即可。

就这么4个步骤,下面看一个实现的demo:

上面是Server端的代码,主要是设置一下配置,具体的代码的实现等,都是在ServerHandler里面执行。下面看一下ServerHandler的代码:

这里是ServerHandler的代码,要注意的是在调用writeAndFlush()方法时,会自动释放上一次的流,不用调用ReferenceCountUtil.release(msg);这个方法,下面看一下Client端的代码:

需要注意的是,这边的通道使用的是NIOSocketChannel对象。在初始化的时候,去调用ClientHandler, 下面看一下ClientHandler

看一下运行结果:

看一下server端:

接收到Client发送的777,然后server回送一个响应

看一下Client端

接收到了Server端的响应,打印了相应的数据

强烈推荐去http://ifeve.com/netty5-user-guide/查看一下用户指南

时间: 2024-11-08 02:13:13

初识Netty的相关文章

Netty教程之初识Netty(1)

Netty是什么? Netty是由JBOSS提供的一个java开源框架. Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 封装了JDK底层BIO和NIO模型,提供高度可用的API. 自带编解码器解决拆包粘包问题,用户只用关心业务逻辑. 精心设计的reactor线程模型支持高并发海量连接. 自带各种协议栈让我们处理任何一种通用协议都几乎不用亲自动手. Netty可以做什么? 1.prc调用 2.长连接 3.http连接 4.web容器

Netty Springboot仿微信聊天全栈实战 从0开发到上线部署视频教程

下载地址:百度网盘下载 第1章 课程介绍 本章首先让大家彻底明白通过本课程的学习具体收获有哪些?课程内容具体安排与学习建议,然后为大家简单介绍课程涉及到的技术栈等. 1-1 课程介绍第2章 netty介绍与相关基础知识 初识netty,学习阻塞与非阻塞,同步与异步,理解BIO.NIO.AIO以及netty的线程模型 2-1 初始netty2-2 阻塞和非阻塞.同步和异步的概念2-3 BIO讲解2-4 NIO讲解2-5 BIO NIO AIO的区别与理解2-6 再看netty2-7 netty的三

Netty/Springboot仿微信聊天全栈实战 从0开发到上线部署

第1章 课程介绍本章首先让大家彻底明白通过本课程的学习具体收获有哪些?课程内容具体安排与学习建议,然后为大家简单介绍课程涉及到的技术栈等.1-1 课程介绍 第2章 netty介绍与相关基础知识初识netty,学习阻塞与非阻塞,同步与异步,理解BIO.NIO.AIO以及netty的线程模型2-1 初始netty2-2 阻塞和非阻塞.同步和异步的概念2-3 BIO讲解2-4 NIO讲解2-5 BIO NIO AIO的区别与理解2-6 再看netty2-7 netty的三种线程模型 第3章 使用net

Java仿微信全栈 高性能后台+移动客户端

第1章 课程介绍课程介绍 第2章 netty介绍与相关基础知识初识netty,学习阻塞与非阻塞,同步与异步,理解BIO.NIO.AIO以及netty的线程模型 第3章 使用netty编写第一个hello netty 服务器从零开始使用netty编写服务器,在网页访问后返回hello netty,主要对服务器启动类,channel初始化器以及助手类讲解,最后会对channel的生命周期进行讲解 第4章 使用netty构建websocket服务器理解实时通信,使用netty的websocket编写服

PythonFlask构建微信小程序订餐系统

第1章 课程介绍课程介绍 第2章 netty介绍与相关基础知识初识netty,学习阻塞与非阻塞,同步与异步,理解BIO.NIO.AIO以及netty的线程模型 第3章 使用netty编写第一个hello netty 服务器从零开始使用netty编写服务器,在网页访问后返回hello netty,主要对服务器启动类,channel初始化器以及助手类讲解,最后会对channel的生命周期进行讲解 第4章 使用netty构建websocket服务器理解实时通信,使用netty的websocket编写服

一起学Netty(五)之 初识ByteBuf和ByteBuf的常用API

网络传输的载体是byte,这是任何框架谁也逃脱不了的一种规定,JAVA的NIO提供了ByteBuffer,用来完成这项任务,当然ByteBuffer也很好的完成了这个任务,Netty也提供了一个名字很相似的载体叫做ByteBuf,相比于ByteBuf而言,它有着更加更多友善的API,也更加易于维护,并且它可以扩容 一般来说,ByteBuf都是维护一个byte数组的,它的内部格式是长成这个样子的 * +-------------------+------------------+---------

netty初识与阻塞和非阻塞、同步与异步的概念

. 原文地址:https://www.cnblogs.com/bozzzhdz/p/9982272.html

下载-深入浅出Netty源码剖析、Netty实战高性能分布式RPC、NIO+Netty5各种RPC架构实战演练三部曲视频教程

下载-深入浅出Netty源码剖析.Netty实战高性能分布式RPC.NIO+Netty5各种RPC架构实战演练三部曲视频教程 第一部分:入浅出Netty源码剖析 第二部分:Netty实战高性能分布式RPC 第三部分:NIO+Netty5各种RPC架构实战演练

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的