Java必学技术之一,网络编程之Netty究竟是什么?

Netty 是由 JBOSS 提供的一个 java 开源框架。Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。java

也就是说,Netty 是一个基于 NIO 的客户、服务器端编程框架,使用 Netty 能够确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty 至关简化和流线化了网络应用的编程开发过程,例如,TCP 和 UDP 的 socket 服务开发。编程

"快速"和"简单"并不用产生维护性或性能上的问题。Netty 是一个吸取了多种协议的实现经验,这些协议包括 FTP,SMTP,HTTP,各类二进制,文本协议,并通过至关精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。windows

Netty 从 4.x 版本开始,须要使用 JDK1.6 及以上版本提供基础支撑。缓存

在设计上:针对多种传输类型的统一接口 - 阻塞和非阻塞;简单但更强大的线程模型;真正的无链接的数据报套接字支持;连接逻辑支持复用;安全

在性能上:比核心 Java API 更好的吞吐量,较低的延时;资源消耗更少,这个得益于共享池和重用;减小内存拷贝服务器

在健壮性上:消除因为慢,快,或重载链接产生的 OutOfMemoryError;消除常常发如今 NIO 在高速网络中的应用中的不公平的读/写比网络

在安全上:完整的 SSL / TLS 和 StartTLS 的支持且已获得大量商业应用的真实验证,如:Hadoop 项目的 Avro(RPC 框架)、Dubbo、Dubbox 等 RPC 框架。多线程

Netty 的官网是:http://netty.io架构

有三方提供的中文翻译 Netty 用户手册(官网提供源信息): http://ifeve.com/netty5-user-guide/框架

2 Netty 架构

 

 

3 线程模型

 

 

Netty 中支持单线程模型,多线程模型,主从多线程模型。

3.1 单线程模型

在 ServerBootstrap 调用方法 group 的时候,传递的参数是同一个线程组,且在构造线程组的时候,构造参数为 1,这种开发方式,就是一个单线程模型。

我的机开发测试使用。不推荐。

3.2 多线程模型

在 ServerBootstrap 调用方法 group 的时候,传递的参数是两个不一样的线程组。负责监听的 acceptor 线程组,线程数为 1,也就是构造参数为 1。负责处理客户端任务的线程组,线程数大于 1,也就是构造参数大于 1。这种开发方式,就是多线程模型。

长链接,且客户端数量较少,链接持续时间较长状况下使用。如:企业内部交流应用。

3.3 主从多线程模型

在 ServerBootstrap 调用方法 group 的时候,传递的参数是两个不一样的线程组。负责监听的 acceptor 线程组,线程数大于 1,也就是构造参数大于 1。负责处理客户端任务的线程组,线程数大于 1,也就是构造参数大于 1。这种开发方式,就是主从多线程模型。

长链接,客户端数量相对较多,链接持续时间比较长的状况下使用。如:对外提供服务的相册服务器。

4 基础程序演示

详见代码

4.1 入门案例

 

4.2 拆包粘包问题解决

netty 使用 tcp/ip 协议传输数据。而 tcp/ip 协议是相似水流同样的数据传输方式。屡次访问的时候有可能出现数据粘包的问题,解决这种问题的方式以下:

4.2.1 定长数据流

客户端和服务器,提早协调好,每一个消息长度固定。(如:长度 10)。若是客户端或服务器写出的数据不足 10,则使用空白字符补足(如:使用空格)。

 

4.2.2 特殊结束符

客户端和服务器,协商定义一个特殊的分隔符号,分隔符号长度自定义。如:'#'、'$_$'、

'AA@'。在通信的时候,只要没有发送分隔符号,则表明一条数据没有结束。

 

4.2.3 协议

相对最成熟的数据传递方式。有服务器的开发者提供一个固定格式的协议标准。客户端和服务器发送数据和接受数据的时候,都依据协议制定和解析消息。

4.3 序列化对象

JBoss Marshalling 序列化

Java 是面向对象的开发语言。传递的数据若是是 Java 对象,应该是最方便且可靠。

 

4.4 定时断线重连

客户端断线重连机制。

客户端数量多,且须要传递的数据量级较大。能够周期性的发送数据的时候,使用。要求对数据的即时性不高的时候,才可以使用。

优势: 可使用数据缓存。不是每条数据进行一次数据交互。能够定时回收资源,对资源利用率高。相对来讲,即时性能够经过其余方式保证。如: 120 秒自动断线。数据变化 1000 次请求服务器一次。300 秒中自动发送不足 1000 次的变化数据。

 

4.5 心跳监测

使用定时发送消息的方式,实现硬件检测,达到心态检测的目的。

心跳监测是用于检测电脑硬件和软件信息的一种技术。如:CPU 使用率,磁盘使用率,内存使用率,进程状况,线程状况等。

4.5.1 sigar

须要下载一个 zip 压缩包。内部包含若干 sigar 须要的操做系统文件。sigar 插件是经过 JVM 访问操做系统,读取计算机硬件的一个插件库。读取计算机硬件过程当中,必须由操做系统提供硬件信息。硬件信息是经过操做系统提供的。zip 压缩包中是 sigar 编写的操做系统文件,如:windows 中的动态连接库文件。

解压须要的操做系统文件,将操做系统文件赋值到${Java_home}/bin 目录中。

4.6 HTTP 协议处理

使用 Netty 服务开发。实现 HTTP 协议处理逻辑。

5 流数据的传输处理

在基于流的传输里好比 TCP/IP,接收到的数据会先被存储到一个 socket 接收缓冲里。不幸的是,基于流的传输并非一个数据包队列,而是一个字节队列。即便你发送了 2 个独立的数据包,操做系统也不会做为 2 个消息处理而仅仅是做为一连串的字节而言。所以这是不能保证你远程写入的数据就会准确地读取。因此一个接收方无论他是客户端仍是服务端,都应该把接收到的数据整理成一个或者多个更有意思而且可以让程序的业务逻辑更好理解的数据。

在处理流数据粘包拆包时,可使用下述处理方式:

使用定长数据处理,如:每一个完整请求数据长度为 8 字节等。(FixedLengthFrameDecoder)使用特殊分隔符的方式处理,如:每一个完整请求数据末尾使用'\0'做为数据结束标记。

(DelimiterBasedFrameDecoder)

使用自定义协议方式处理,如:http 协议格式等。

使用 POJO 来替代传递的流数据,如:每一个完整的请求数据都是一个 RequestMessage 对象,在 Java 语言中,使用 POJO 更符合语种特性,推荐使用。

 

相关文章
相关标签/搜索