【Netty】初识Netty
一、为什么会出现Netty
之前我们使用通用的应用程序或库来相互通信。例如,我们经常使用HTTP客户机库从web服务器检索信息,并通过web服务调用远程过程调用。然而,通用协议或其实现有时伸缩性不是很好。这就像我们不使用通用HTTP服务器来交换大型文件、电子邮件消息和近乎实时的消息(如财务信息和多人游戏数据)一样。所需要的是专门用于特定目的的高度优化的协议实现。例如,您可能希望实现一个针对基于ajax的聊天应用程序、媒体流或大型文件传输进行优化的HTTP服务器。您甚至可能想要设计和实现一个完全适合您需要的新协议。另一个不可避免的情况是,您必须处理遗留的专有协议,以确保与旧系统的互操作性。在这种情况下,重要的是在不牺牲结果应用程序的稳定性和性能的情况下,我们能够多快地实现该协议。
那么,Netty的出现,就能很好的解决上面的问题;
二、Netty是什么
Netty项目致力于提供异步事件驱动的网络应用程序框架和工具,以便快速开发可维护的高性能和高可伸缩性协议服务器和客户端。
换句话说,Netty是一个NIO客户机服务器框架,它支持快速而简单地开发协议服务器和客户机等网络应用程序。它大大简化和流线网络编程,如TCP和UDP套接字服务器的开发。
“快速而简单”并不意味着最终的应用程序会出现可维护性或性能问题。Netty经过精心设计,从实现许多协议(如FTP、SMTP、HTTP)和各种二进制和基于文本的遗留协议中吸取了经验。因此,Netty成功地找到了一种方法,在不妥协的情况下实现开发、性能、稳定性和灵活性。
一些用户可能已经找到了其他声称具有相同优势的网络应用程序框架,您可能想知道是什么使Netty与它们如此不同。答案是它所基于的哲学。Netty旨在从第一天起就为您提供最舒适的API和实现体验。它并不是什么有形的东西,但是当你阅读Netty官方指南并与Netty玩耍时,你会意识到这种哲学会让你的生活变得更容易。
三、Netty相关的其他概念
/**
* @author zhangboqing
* @date 2018/8/29
*
* 关于netty ,首先要搞清楚,这是建立在客户端和服务端之间的。
* 服务端建立相应的规则,然后运行起来,等待客户端访问或者发送”消息“
*
* 服务端的建立
* 第一步:先建立相应的规则 ==> DiscardServerHandler
* 第二步:我们需要应用相应的规则。就是说,我们建立了接收消息的规则,但是光建立规则有什么用,仅仅只是一个规则,我们需要把这个规则”应用“起来,通常就是我们通常的”运行“;==>DiscardServer
* 第三步:我们现在相应的规则已经建立,并且”运行“规则的代码也OK,所以运行DiscardServer中 public static void main(String[] args) 启动服务端。
*
* 客户端访问
* 打开命令行窗口,键入 telnet 127.0.0.1 8080 回车,进入telnet 终端
* 然后随便输入回车,服务端就会打印你输入的数据
*/
package com.zbq.simpledemo; /**
*
*
* netty 官方API: http://netty.io/4.1/api/index.html
* netty 中文指南:https://waylau.com/netty-4-user-guide/
*
*
* 关于NIO基础的知识:https://my.oschina.net/andylucc/blog/614295
*
* http://www.cnblogs.com/dolphin0520/p/3919162.html
*
* http://blog.csdn.net/wuxianglong/article/details/6604817
*
*/ /**
* netty 特点:
* 1.并发高
* Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高
* 2.传输快
* Netty使用了NIO中的一大特性——零拷贝,利用直接内存对数据进行操作,从而加快了传输速度
* 3.封装好
*
*
* Channel
* 数据传输流,与channel相关的概念有四个:
*
* Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
* 一个客户端与服务器通信的通道
* ChannelHandler,核心处理业务就在这里,用于处理业务请求。
* 业务逻辑处理器,分为ChannelInboundHandler 输入数据处理器
* 和ChannelOutboundHandler 输出业务处理器
* 通常情况下,业务逻辑都是存在于ChannelHandler之中
* ChannelHandlerContext,用于传输业务数据。
* 通信管道的上下文
* ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。
* 用于存放ChannelHandler的容器
*
* 他们的交互流程是:
*
* 1.事件传递给 ChannelPipeline 的第一个 ChannelHandler
* 2.ChannelHandler 通过关联的 ChannelHandlerContext 传递事件给 ChannelPipeline 中的 下一个
*
* Buffer
* 他有三种使用模式:
* 1.Heap Buffer 堆缓冲区
* 堆缓冲区是ByteBuf最常用的模式,他将数据存储在堆空间。
* 2.Direct Buffer 直接缓冲区
* 直接缓冲区是ByteBuf的另外一种常用模式,他的内存分配都不发生在堆,jdk1.4引入的nio的ByteBuffer类允许jvm通过本地方法调用分配内存,这样做有两个好处
* 通过免去中间交换的内存拷贝, 提升IO处理速度; 直接缓冲区的内容可以驻留在垃圾回收扫描的堆区以外。
* DirectBuffer 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响.
* 3.Composite Buffer 复合缓冲区
* 复合缓冲区相当于多个不同ByteBuf的视图,这是netty提供的,jdk不提供这样的功能。
*
*
* Codec
* Netty中的编码/解码器,通过他你能完成字节与pojo、pojo与pojo的相互转换,从而达到自定义协议的目的。
* 在Netty里面最有名的就是HttpRequestDecoder和HttpResponseEncoder了
*/
【Netty】初识Netty的更多相关文章
- DotNetty网络通信框架学习之初识Netty
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Netty1:初识Netty
为什么使用Netty Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性.可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明.对于为什么使用Netty这个话 ...
- Netty(一):初识Netty
Netty是什么? Netty是由JBOSS提供的一个java开源框架. Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 封装了JDK底 ...
- Netty:初识Netty
前文总结了NIO的内容,有了NIO的一些基础之后,我们就可以来看下Netty.Netty是Java领域的高性能网络传输框架,RPC的技术核心就是网络传输和序列化,所以Netty给予了RPC在网络传输领 ...
- 【Netty】Netty入门之WebSocket小例子
服务端: 引入Netty依赖 <!-- netty --> <dependency> <groupId>io.netty</groupId> <a ...
- Netty学习——Netty和Protobuf的整合(二)
Netty学习——Netty和Protobuf的整合(二) 这程序是有瑕疵的,解码器那里不通用,耦合性太强,有两个很明显的问题,但是要怎么解决呢?如:再加一个内部类型 Person2,之前的代码就不能 ...
- Netty学习——Netty和Protobuf的整合(一)
Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...
- [Netty 1] 初识Netty
1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架. Netty项目地址:htt ...
- Netty 学习 一、初识Netty【原创】
在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...
- 初识Netty
我们已经了解了Socket通信/IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识,其实我们之前所学习的仅仅是一个模型,如果想把这些真正的用于实际工作中去,其实我们之前所学习的仅仅是一个模型 ...
随机推荐
- 在pat考试中快速调整Dev-cpp颜色配置
在菜单栏中:tool(工具)->Edit Options(编辑器环境) 点击General选项卡: 把Color调为黑色. 点击Color选项卡: 讲Select theme设置为Obsidia ...
- P3258 [JLOI2014]松鼠的新家题解
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有\(n\)个房间,并且有\(n-1\)根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...
- CF1174E Ehab and the Expected GCD Problem(DP,数论)
题目大意:对于一个序列,定义它的价值是它的所有前缀的 $\gcd$ 中互不相同的数的个数.给定整数 $n$,问在 $1$ 到 $n$ 的排列中,有多少个排列的价值达到最大值.答案对 $10^9+7$ ...
- ECMAScript6-2
1.模板字串.箭头函数 1.1.模板字串 传统js,输出模板 var str='<b>姓名:</b>'+ '<span>lxr</span>'; con ...
- osx或windows系统下,用ftp上传文件到阿里云虚拟主机脚本
某天突然发现,一直在用的ftp工具并不好用,操作界面太过繁琐,而且不太稳定.于是自己找资料,整合了几句虽然简单,但是方便的代码. mac脚本 #从本地向FTP批量上传文档 需要赋予该.shell文件权 ...
- 避免因为Arcgis Server服务设置不当导致Oracle Process溢出的方法
我之前写过一篇文章<arcsoc进程无限增长导致oracle processes溢出>(见链接:https://www.cnblogs.com/6yuhang/p/9379086.html ...
- unity延迟加载图片
把加载图片所需要的信息封装成一个任务(自己写的类,包括路径,回调等信息),再将该任务添加到自己写的任务池中(在update中执行任务委托),由于只是添加任务操作,加载完成后自动调用回调函数实例化,对主 ...
- Go语言【数据结构】切片
切片 简介 简单地说,切片就是一种简化版的动态数组.Go 数组的长度不可改变,而切片长度是不固定,切片的长度自然也就不能是类型的组成部分了.数组虽然有适用它们的地方,但是数组的类型和操作都不够灵活,因 ...
- 【转】Mac入门(一)基本用法
我前五年一直外包到微软,每天使用的都是Windows系统和.NET. 2012年加入VMware, 公司的工作机是台Mac 笔记本(MacBook Pro), 所以有机会接触Mac系统 Mac和Wi ...
- python装饰器的使用场景(转)
原文:https://www.cnblogs.com/wupeiqi/articles/4980620.html 1.必备 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #### ...