NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操作的结果: 2.在执行异步操作的时候传入一个java.io.channels. ComplementHandler接口的实现类作为操作完成的回调. NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了NI…
经过前面的铺垫,在这一节我们进入NIO编程,NIO弥补了原来同步阻塞IO的不足,他提供了高速的.面向块的I/O,NIO中加入的Buffer缓冲区,体现了与原I/O的一个重要区别.在面向流的I/O中,可以将数据直接写入或者将数据直接读到Stream对象中.下面看一些概念 Buffer缓冲区 而在NIO中,所有数据都是用缓冲区处理的,在读取数据时,直接读到缓冲区,在写数据时,也是写到缓冲区,任何时候访问NIO中的数据,都是通过缓冲区进行操作.最常用的是个ByteBuffer缓冲区,他提供了一组功能用…
公司的一些项目采用了netty框架,为了加速适应公司开发,本博主认真学习netty框架,前一段时间主要看了看书,发现编程这东西,不上手还是觉得差点什么,于是为了加深理解,深入学习,本博主还是决定多动手,一方面记录一些总结性的思考性东西,另一方面也为日后复习查看留下一些东西. 那么废话少说,现在开始,首先在进入netty学习之前,我们是要认识一下IO并引出NIO的概念. 与IO相关的几种编程及特点分为: 编程类别 特点 传统BIO编程 典型的一请求一应答模型,一个请求新建一个线程,应答完成线程销毁…
在上一节我们介绍了四种IO相关编程的各个特点,并通过代码进行复习了传统的网络编程代码,伪异步主要是引用了线程池,对BIO中服务端进行了相应的改造优化,线程池的引入,使得我们在应对大量客户端请求的时候不会导致虚拟机可贵的线程资源耗尽而宕机,在本小节,我们来看看伪异步代码.多注意引入的线程池代码. 伪异步IO模型图如下(): 当有新的客户端请求到来时,将socket封装成一个Task(该任务实现了Runnable接口),投递到线程池中进行处理.而线程池始终维护一个消息队列和N个活跃着的线程,这些线程…
Netty权威指南(异步非阻塞通信领域的经典之作,国内首本深入剖析Netty的著作,全面系统讲解原理.实战和源码,带你完美进阶Netty工程师.) 李林锋 著   ISBN 978-7-121-23343-2 2014年6月出版 定价:79.00元 524页 16开 编辑推荐 - 资深一线专家诚意之作,总结多年实践经验,带你全面掌握Java高并发异步通信的首选框架——Netty. - Facebook.阿里巴巴.1号店.并发编程网.JBoss等多位资深技术专家联名力荐. <Netty权威指南>…
<Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码:524 版次:1-1 所属分类:计算机 > 软件与程序设计 > 综合 > 高级程序语言设计 更多关于>>> <Netty权威指南>   编辑推荐 资深一线专家诚意之作,总结多年实践经验,带你全面掌握Java高并发异步通信的首选框架——Netty. Facebo…
图书简介:<Netty 权威指南(第2 版)>是异步非阻塞通信领域的经典之作,基于最新版本的Netty 5.0 编写,是国内很难得一见的深入介绍Netty 原理和架构的书籍,也是作者多年实战经验的总结和浓缩.内容不仅包含Java NIO入门知识.Netty 的基础功能开发指导.编解码框架定制等,还包括私有协议栈定制和开发.Netty 核心类库源码分析,以及Netty 的架构剖析.   相关截图:   图书目录: 基础篇走进Java NIO 第1 章Java 的I/O 演进之路.2 1.1 I/…
一.基础篇 走进Java NIO 1. Java 的 I/O 演进之路:https://www.cnblogs.com/zengzhihua/p/9930652.html 2. NIO 入门:https://www.cnblogs.com/zengzhihua/p/9953646.html   二.入门篇 Netty NIO 开发指南 3. Netty 入门应用:https://www.cnblogs.com/zengzhihua/p/10090909.html 4. TCP 粘包/拆包问题的解…
目录 1.1 I/O 基础入门 1.1.1 Linux 网络 I/O 模型 1.1.2 I/O 多路复用技术 2. Java 的 I/O 演进   1.1 I/O 基础入门 Java1.4 之前的早期版本,对 I/O 的支持存在如下问题: 没有数据缓冲区,I/O 性能存在问题: 没有 C 或者 C++ 中的 Channel 概念,只有输入和输出流: 同步阻塞式 I/O 通信(BIO),通常会导致通信线程被长时间阻塞: 支持的字符集有限,硬件可移植性不好.   1.1.1 Linux 网络 I/O…
[TOC]   2.1 同步阻塞 I/O 采用 BIO 通信模型的服务器,通常由一个独立的 Acceptor 线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完成后,通过输出流返回应答给客户端,线程销毁. graph TD A1[Socket] -->|读/写| B(Acceptor 线程) A2[Socket] -->|读/写| B A3[Socket] -->|读/写| B B -->|创建| C1[Thread] B -->…
NIO简介:与Socket和ServerSocket类相对应,NIO提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,这两种新通道都支持阻塞和非阻塞两种模式.阻塞模式使用简单,但是性能和可靠性不好,非阻塞模式正好相反. 1.缓冲区Buffer:一个对象,包含一些要写入或要读出的数据.任何时候访问NIO中数据,都是通过缓冲区进行操作.缓冲区实质是一个数据,最常用的缓冲区是ByteBuffer.每一种Java基本类型都对应一种缓冲区,如ByteBuff…
编解码技术主要应用在网络传输中,将对象比如BOJO进行编解码以利于网络中进行传输.平常我们也会将编解码说成是序列化/反序列化 定义:当进行远程跨进程服务调用时,需要把被传输的java对象编码为字节数组或者ByteBuffer对象.而当远程服务读取到ByteBuffer对象或者字节数组时,需要将其解码为发送时的java对象.这被称为java对象编解码技术.比如java的序列化. 但是,java的序列化有一定的弊端: java序列化是java私有的协议,其他语言不支持,故而不能实现跨语言: 其次,序…
经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承ChannelHanderAdapter时候,发现在其接口中没有可以实现的channelRead方法和channelReadComplete方法,然后查阅官网才发现netty5.0不见了,网上说是舍弃了,然后再看官网的一些例子,发现官网上继承的是ChannelInboundHandlerAdapter,…
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SelectionKey; import…
由JDK1.7提供的NIO2.0新增了异步的套接字通道,它是真正的异步I/O,在异步I/O操作的时候可以传递信号变量,当操作完成后会回调相关的方法,异步I/o也被称为AIO,对应于UNIX网络编程中的事件驱动I/O:不再需要通过多路复用器(Selector)对注册的通道进行轮询操作就可以实现异步读写 package com.hjp.netty.aio; import java.io.IOException; public class TimeServer { public static void…
JBoss Marshalling 是一个java序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了一些可调参数和附加特性,这些参数和特性可以通过工厂类进行配置. 一.开发环境准备 要用到JBoss Marsharlling编解码就需要相应的jar包,这里我们需要引入其api和序列化类库. 首先在maven仓库中查找竟然没找到,只好官网下载了http://jbossmarshalling.jboss.org/downloads…
首先我们来看一下protobuf的优点: 谷歌长期使用成熟度高: 跨语言支持多种语言如:C++,java,Python: 编码后消息更小,更利于存储传输: 编解码性能高: 支持不同协议版本的兼容性: 支持定义可选和必选字段: 接下来就让我们试用一下吧. 一.Protobuf开发环境搭建 下载Protobuf的Windows版本,本博主用的是protoc-3.6.1-win32.zip,解压后进入bin目录可以看到protoc.exe(下面的.proto文件是博主事先拉进来的) 然后我们打开cmd…
第1章 Java的I/O演进之路 1.1 Linux网络I/O模型 fd:file descriptor,文件描述符.linux内核将所有外部设备都看作一个文件来操作,对文件的读写会调用内核提供的命令,返回一个文件描述符.对一个socket的读写也会有相应的socket fd.描述符就是一个指向内核中结构体的数字. Unix I/O模型分为5类: ①阻塞IO模型 文件操作的默认模型.进程空间调用recvfrom函数,直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间,进程会…
1.Java内存模型 Java虚拟机规范中试图定义一种java内存模型(java Memory Model,jmm)来屏蔽掉各种操作系统.虚拟机实现厂商和硬件的内存访问差异,以确保Java程序在所有操作系统和平台上能够实现一次编写.到处运行的效果. 1.1.工作内存和主内存 Java内存模型规定了所有的变量都存储在主内存中.每个线程还有自己的工作内存,它保存了被该线程使用到的变量的主内存副本拷贝.线程对这些变量的操作都在自己的工作内存中进行,不能直接操作主内存和其他工作内存中存储的变量或者变量副…
转载:http://blog.csdn.net/clarkkentyang/article/details/52529785 第一章(略) 第二章 NIO入门 2.1传统的BIO编程(同步阻塞I/O服务端通信模型[一客户一线程]) 网络编程的基本模型:Client/Server模型,也就是2个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进…
package com.hjp.netty.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.…
无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个“流”协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. TCP粘包/拆包问题说明 假设客户端分别发送…
由于该书是基于Netty5编写的样例代码,而Netty5已经被官方废弃. 目前基于推荐版的4.1.12.Final在学习过程中,可能会出现个别接口不一致的情况.所以记录可在4.1.12下编译通过的代码 package net.xjdsz.n; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.chan…
TCP是个流协议,流没有一定界限.TCP底层不了解业务,他会根据TCP缓冲区的实际情况进行包划分,在业务上,一个业务完整的包,可能会被TCP底层拆分为多个包进行发送,也可能多个小包组合成一个大的数据包进行发送,这就是TCP的拆包和粘包. 产生问题的原因 应用程序write写入的字节大小大于套接字缓冲区大小 进行MSS大小的TCP分割: 以太网帧的payload大于MTU进行IP分片 关于MSS和MTU的分段问题可以参考https://www.cnblogs.com/yuyutianxia/p/8…
为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化——后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽. 当有新的客户端接入时,将客户端Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理.由于线程池可以设置消息队列的大小和最大线程数,因此资源占用是可控的,无论多少客户端并发访问都不会导致资源耗尽和宕…
网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信. 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户,线程销毁. 该模型下,服务端…
TCP以流的方式进行数据传输,上层应用协议为了对消息进行区分,通常采用以下4中方式: 消息长度固定,累计读取到长度综合为定长LEN的报文后,就认为读取到了一个完整的消息,将计数器置位,重新开始读取下一个数据报: 将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛: 将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的分隔符: 通过在消息头中定义长度字段来标识消息的总长度. DelimiterBaseFrameDecoder——分隔符解码器,FixedLengthF…
Netty 服务端   Netty 客户端…
OS 1.CPU 用户态时间(us):cpu执行应用代码所占时间的百分比. 内核态时间(sy):cpu执行内核代码所占时间的百分比,系统态时间与应用相关. 空闲时间(id):cpu空闲时间百分比.空闲可能的原因: 1.应用被同步原语阻塞.等待锁释放 2.应用等待某些东西,例如:查询数据库并等待返回结果 3.应用的确无所事事 运行队列(r):所有正在运行和就绪状态(一旦有可用cpu就可以运行)的线程数.该数据最好小于或等于CPU个数,否则性能就可能会下降.如果长时间运队列过长,则可能是系统过载.…
发生了粘包,我们需要将其清晰的进行拆包处理,这里采用LineBasedFrameDecoder来解决 LineBasedFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看是否有“\n”或“\r\n”,如果有,就以此为结束位置,从可读索引到结束位置区间的字节就组成一行,它是以换行为结束标志的编码器,支持携带结束符或者不携带结束符两种方式,同时支持配置单行最大长度,如果连续读取到的最大长度后仍没有发现换行符,就会抛出异常,同时忽略掉之前读到的异常码流. StringDe…