
Netty4.1
文章平均质量分 80
介绍netty的常用知识
白夜行515
世界上有两样东西不能直视:一是太阳,二是人心!
展开
-
【Netty基础】protobuf详解
前言我在上篇博文中简单介绍了一下protobuf,由于protobuf是Netty默认的序列化协议,再说它的性能也很高,接下来就详细的说一下protobuf协议!引入Netty为什么要提供编解码框架作为一个高性能的异步、NIO通信框架,编解码框架是Netty的重要组成部分。Netty逻辑架构图从网络读取的inbound消息,需要经过解码,将二进制的数据报转换成应用层协议消息或者业务消息,才能够被上原创 2017-06-16 15:22:04 · 2097 阅读 · 0 评论 -
【Netty入门】解决TCP粘包/分包的实例
回顾TCP粘包/分包问题的解决方法1.消息定长2.在包尾都增加特殊字符进行分割3.将消息分为消息头和消息体针对这三种方法,下面我会分别举例验证FixedLengthFrameDecoder类对应第一种解决方法:消息定长(1)例1:服务端代码:public class Server4 { public static void main(String[] args) throws SigarEx原创 2017-06-13 18:21:16 · 4240 阅读 · 1 评论 -
【Netty基础】Netty的“零拷贝”
零拷贝的定义Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据。但Netty 中的 Zero-copy 与 OS 的 Zero-copy原创 2017-06-16 21:46:14 · 10930 阅读 · 2 评论 -
【Netty源码】服务端源码剖析
引入如果你对Netty的服务端启动流程不是很了解,请参考基于Netty的Server代码,以便对服务器的启动流程有个清晰的认识,才能更好的理解源码中的步骤。Netty是基于Nio实现的,也有selector、serverSocketChannel、socketChannel和selectKey等,只不过Netty把这些实现都封装在了底层。开始时,ServerBootstrap实例中需要两个Ni原创 2017-08-01 12:07:24 · 568 阅读 · 0 评论 -
【Netty源码】ChannelPipeline源码剖析
1.图解每个channel内部都会持有一个ChannelPipeline对象pipeline. pipeline默认实现DefaultChannelPipeline内部维护了一个DefaultChannelHandlerContext链表。当channel完成register、active、read等操作时,会触发pipeline的相应方法。当channel注册到selector时,触发pip原创 2017-08-01 16:12:30 · 505 阅读 · 0 评论 -
【Netty源码】read、write与accept源码剖析
引入在上篇博文中我讲了NioEventLoop的源码剖析,其中的方法调用如下,NioEventLoop.run()->selectNow()->processSelectedKeys()->processSelectedKeysOptimized()最后processSelectedKeysOptimized方法中有三个事件:可读、可写、可接收,我并没有细说,所以在这篇文章中我就详细讲一下。read原创 2017-08-01 16:41:49 · 764 阅读 · 0 评论 -
【Netty源码】内存管理
概述Netty内部的内存管理机制。首先,Netty会预先申请一大块内存,在内存管理器中一般叫做Arena。Netty的Arena由许多Chunk组成,而每个Chunk又由一个或多个Page组成。Chunk通过二叉树的形式组织Page,每个叶子节点表示一个Page,而中间节点表示内存区域,节点自己记录它在整个Arena中的偏移地址。当区域被分配出去后,中间节点上的标记位会被标记,这样就表示这个中间原创 2017-08-01 17:09:36 · 542 阅读 · 0 评论 -
【Netty源码】ByteBuf源码剖析
ByteBuf概述1.ByteBuf与ByteBuffer的区别ByteBuf不是对ByteBuffer的封装,而是重新实现了一个缓冲区。ByteBuffer只使用了一个position指针来记录当前的读写位置,ByteBuf使用了两个指针readerIndex, writerIndex分别来记录当前的读写位置,使用起来更加简单和方便。ByteBuffer是一个固定长度的缓冲区,当put方法要写原创 2017-08-01 19:21:29 · 813 阅读 · 0 评论 -
【NIO详解】基于NIO的client与server
服务端代码public class Server_Test { public static void main(String[] args) { int port = 8080; if (args != null && args.length > 0) { try { port = Integer.val原创 2017-06-12 20:54:10 · 4627 阅读 · 0 评论 -
【NIO详解】Channel、Selector与Pipe
Channel1.定义: Channel 表示 IO 源与目标打开的连接。Channel 类似于传统的“流”。只不过Stream是单向的,如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。但Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互。图解: 2.常用类•FileChannel:用于读原创 2017-06-12 20:21:29 · 4827 阅读 · 0 评论 -
【Netty入门】TCP 粘包/拆包问题产生原因
TCP粘包/分包问题的由来因为TCP是以流的方式来处理数据,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送。这样说可能比较抽象,下面举例来说明TCP拆包/粘包问题!图解:如果客户端分别发送两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,可能会出现四种情况。(1)服务端分别读取到D1和D2,没有产生粘包和拆包的情况,如下图:(2)服务端一原创 2017-06-13 17:30:35 · 757 阅读 · 0 评论 -
【Netty入门】Netty概述
1.Netty简介Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果,比Mina更高效。2.Netty的特点(1) 使用更高效的socket底层,对epoll空轮询引起的cpu占用飙升在内部进行了处理原创 2017-06-12 21:44:35 · 1577 阅读 · 0 评论 -
【Netty入门】Netty的线程模型
Reactor线程模型Reactor 模式基于事件驱动,适合处理海量的I/O 事件。它主要由多路复用器(Acceptor)、事件分发器(Dispatcher)、事件处理器(Handler)组成,可以分为三种。单线程模型所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。这是最简单的Reactor模型。Reactor线程负责多路分离套接字,Accept新原创 2017-06-13 13:49:05 · 1138 阅读 · 0 评论 -
【Netty入门】几种序列化协议的介绍
序列化概述1.序列化定义序列化(serialization)就是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等;反序列化(deserialization)则是将从网络、磁盘等读取的字节数组还原成原始对象,以便后续业务的进行,一般也将反序列化称为解码(Decode),主要用于网络传输对象的解码,以便完成远程调用。2.序列化的“鼻祖”我原创 2017-06-14 20:59:21 · 12222 阅读 · 2 评论 -
【Netty基础】基于HTTP的文件下载Server实例
功能描述:打开浏览器,可实现文件下载功能例:public class HttpDownLoadFileServer { private static final String DEFAULT_URL = "/src/image/"; public void run(final int port, final String url) throws Exception { E原创 2017-06-16 19:08:13 · 1853 阅读 · 0 评论 -
【Netty基础】基于HTTP的上传Server实例
功能描述:打开浏览器,可上传本地文件到服务端。例:public class MyHttpUploadServer { //指定ip地址和端口号 static final String IP = "127.0.0.1"; static final int PORT = 8080; public static void main(String[] args) {原创 2017-06-16 20:19:52 · 1391 阅读 · 0 评论 -
【Netty基础】Netty的高性能及NIO的epoll空轮询bug
Selector BUG出现的原因若Selector的轮询结果为空,也没有wakeup或新消息处理,则发生空轮询,CPU使用率100%,Netty的解决办法对Selector的select操作周期进行统计,每完成一次空的select操作进行一次计数,若在某个周期内连续发生N次空轮询,则触发了epoll死循环bug。重建Selector,判断是否是其他线程发起的重建请求,若不是则将原Socket原创 2017-06-17 10:08:31 · 23973 阅读 · 5 评论 -
【NIO引入】BIO、AIO与NIO的区别
同步异步与阻塞非阻塞的区别1.同步例:买饭:自己亲自去饭馆买饭,这就是同步(自己处理IO读写)2.异步例:买饭:叫外卖送到家,这就是异步(IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(饭名和地址),OS需要支持异步IO操作API)3.阻塞例:办理业务:一直排队等待(调用会一直阻塞到读写完成才返回)4.非阻塞例:办理业务:抽号后就可以做其他事,如果你等不急,可以去问工作人员到你了没,如果原创 2017-06-12 16:29:46 · 11314 阅读 · 4 评论 -
【NIO引入】传统的IO模型
传统的BIO模型服务端代码:public class Server1 { public static void main(String[] args) { System.out.println("服务器启动..."); Socket client = null; BufferedReader in = null; PrintWri原创 2017-06-12 15:52:17 · 534 阅读 · 0 评论 -
【NIO详解】NIO概述
一、NIO简介Java NIO,通常称为 New IO 或 No Block IO, 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。注:JDK1.4的版本为 NIO 1.0, 而JDK7的版本为 NIO 2.0二、NIO与传统IO的区别1.传统I原创 2017-06-12 17:13:16 · 1883 阅读 · 0 评论 -
【NIO详解】Buffer源码剖析
1.Buffer简介NIO中的Buffer 主要用于与NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。在NIO中,所有的数据都是用Buffer处理的,它是NIO读写数据的中转池。Buffer实质上是一个数组,通常是一个字节数据,但也可以是其他类型的数组。但一个缓冲区不仅仅是一个数组,重要的是它提供了对数据的结构化访问,而且还可以跟踪系统的读写进程。2.Buffer使用步骤(1)写原创 2017-06-12 19:27:35 · 616 阅读 · 0 评论 -
【Netty入门】基于Netty的Server / Client
回顾NIO我在之前介绍了NIO的server与client,虽然说编程相对于BIO比较复杂,但是性能高啊,而且Netty的server/client也是基于NIO的。所以,在介绍Netty的server/client 之前,先回顾一下NIO 的server / Client的步骤还是很有你要的.1.NIO 服务端Server开发步骤:(1)创建ServerSocketChannel,配置它为非阻塞模原创 2017-06-13 09:30:36 · 15996 阅读 · 7 评论 -
【Netty源码】NioEventLoop源码剖析
NioEventLoopGroup1.NioEventLoopGroup的类层次图2.NioEventLoopGroup 实例化过程分析:EventLoopGroup(其实是MultithreadEventExecutorGroup) 内部维护一个类型为 EventExecutor children 数组, 其大小是 nThreads, 这样就构成了一个线程池如果我们在实例化 NioEventL原创 2017-08-01 15:48:00 · 915 阅读 · 0 评论