NIO及Netty
军伟@
Java开发工程师
展开
-
5种IO模型
(1)阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型,缺省情形下,所有文件操作都是阻塞的。我们以套接字接口为例来讲解此模型:在进程空间中调用revcfrom,其系统调用直到数据包到达且被复制到应用进程的缓存区中或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型,如图:(2)非阻塞I/O模型:recvfrom从应原创 2016-11-02 23:43:19 · 3323 阅读 · 0 评论 -
NIO学习--IO模型
上一篇我们讲到了关于TCP/IP协议的一些内容,这些是网络编程的必备知识。在了解NIO之前我们必须要了解一下对应的系统层IO模型,比如java的NIO对应是那种IO模型,阻塞和同步的差异在哪里,又是否相同。了解了这些更方便我们的后续的NIO探解。一、同步、异步、阻塞、非阻塞同步、异步,阻塞、非阻塞,这四种状态常有人分不清,主要是这四种状态的定义本身也不是很明确,所以各种解答的方式都有。常见的分类有...转载 2018-07-13 10:02:18 · 435 阅读 · 0 评论 -
NIO学习--TCP探秘
在介绍NIO之前有必要了解下TCP协议,因为目前多数应用都是给予应用层进行操作,导致隐藏了大量的网路细节,知道这些细节以及原理对我们的问题排查很有益处。一、TCP 特性TCP 是一种面向连接的协议,它给用户进程提供可靠的全双工的字节流。确保数据包的可靠,有序,以及支持流量控制。关于TCP 为何要做这些,我们从以下几个方面入手:IP网络层为何不保证数据包的可靠性TCP协议如何保证包可达、有序TCP协...转载 2018-07-13 10:01:32 · 468 阅读 · 0 评论 -
【Netty源码分析】ChannelPipeline(二)
在上一篇博客【Netty源码学习】ChannelPipeline(一)中我们只是大体介绍了ChannelPipeline相关的知识,其实介绍的并不详细,接下来我们详细介绍一下ChannelPipeline及其实现类。1、ChannelPipeline的结构图:这张ChannelPipeline的结构图我们应该是看到过的,其实在ChannelPipeline接口中只是覆盖了ChannelInboun原创 2016-11-16 20:32:26 · 1471 阅读 · 0 评论 -
【Netty源码分析】Reactor线程模型
1. 背景1.1. Java线程模型的演进1.1.1. 单线程时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一。在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能。1.1.2. 多线程随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核。通转载 2016-11-24 09:20:15 · 5742 阅读 · 4 评论 -
【Netty源码分析】数据读取过程
首先客户端连接到服务端时服务端会开启一个线程,不断的监听客户端的操作。这个线程的执行操作在NioEventLoop的run方法中,其实操作是在processSelectedKeys中,监听是否进行读操作protected void run() { for (;;) { try { switch (selectStrategy.原创 2016-11-23 13:51:38 · 3488 阅读 · 0 评论 -
【Netty源码分析】发送数据过程
前面两篇博客【Netty源码分析】Netty服务端bind端口过程和【Netty源码分析】客户端connect服务端过程中我们分别介绍了服务端绑定端口和客户端连接到服务端的过程,接下来我们分析一下数据发送的过程。future.channel().writeAndFlush("Hello Netty Server ,I am a common client"); 调用AbstractChannel原创 2016-11-23 11:22:07 · 3654 阅读 · 0 评论 -
【Netty源码分析】客户端connect服务端过程
上一篇博客【Netty源码分析】Netty服务端bind端口过程 我们介绍了服务端绑定端口的过程,这一篇博客我们介绍一下客户端连接服务端的过程。ChannelFuture future = boostrap.connect("127.0.0.1", 8080).sync(); 调用BootStrap的connect函数public ChannelFuture connect(String ine原创 2016-11-23 10:36:42 · 3377 阅读 · 0 评论 -
【Netty源码分析】Netty服务端bind端口过程
这一篇博客我们介绍一下Netty服务端绑定端口的过程,我们通过跟踪代码一直到NIO原生绑定端口的操作。绑定端口操作ChannelFuture future = serverBootstrap.bind(8080).sync();AbstractBootstrap中bind操作public ChannelFuture bind(int inetPort) { return bind(原创 2016-11-23 10:09:07 · 7624 阅读 · 0 评论 -
【Netty源码学习】ChannelPipeline(一)
ChannelPipeline类似于一个管道,管道中存放的是一系列对读取数据进行业务操作的ChannelHandler。1、ChannelPipeline的结构图:在之前的博客【Netty源码学习】入门示例我们看到了如下的代码:future.channel().writeAndFlush("Hello Netty Server ,I am a common client"); 其实就是Clien原创 2016-11-14 21:17:14 · 1877 阅读 · 0 评论 -
【Netty源码学习】DefaultChannelPipeline(三)
上一篇博客中【Netty源码学习】ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具体实现了哪些功能。之前我们已经了解过DefaultChannelPipeline其实是一个ChannelHandlerContext的循环链表,对于网络数据的接收处理以及处理发送都在ChannelHa原创 2016-11-28 19:24:16 · 1632 阅读 · 0 评论 -
【Netty源码学习】ServerBootStrap
上一篇博客【Netty源码学习】BootStrap中我们介绍了客户端使用的启动服务,接下来我们介绍一下服务端使用的启动服务。总体来说ServerBootStrap有两个主要功能:(1)调用父类AbstractBootStrap的initAndregister函数将NioServerSocketChannel注册到Selector中,上一篇博客中我们已经介绍了。(2)调用父类的doBind0函数绑定原创 2016-11-09 18:41:32 · 1538 阅读 · 0 评论 -
【Netty源码学习】EventLoopGroup
在上一篇博客【Netty源码解析】入门示例中我们介绍了一个Netty入门的示例代码,接下来的博客我们会分析一下整个demo工程运行过程的运行机制。 无论在Netty应用的客户端还是服务端都首先会初始化EventLoopGroupEventLoopGroup group = new NioEventLoopGroup();原创 2016-10-27 23:09:32 · 2372 阅读 · 0 评论 -
【Netty源码学习】BootStrap
BootStrap是客户端的启动类,其主要功能就是设置必要的参数然后启动客户端。实现如下:Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_原创 2016-11-07 21:47:33 · 1307 阅读 · 0 评论 -
【Netty源码解析】NioEventLoop
上一篇博客【Netty源码学习】EventLoopGroup中我们介绍了EventLoopGroup,实际说来EventLoopGroup是EventLoop的一个集合,EventLoop是一个单线程的线程池,其接口和类实现关系如下:接下来我们主要介绍实现类NioEventLoop中实现的操作,通过NioEventLoop的继承关系图我们可以看到,其就是一个单线程的线程池。首先我们看NioEven原创 2016-11-07 20:27:27 · 2328 阅读 · 0 评论 -
【Netty源码学习】入门示例
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,原创 2016-10-17 15:54:32 · 4455 阅读 · 4 评论 -
NIO学习--Reactor模型
通过之前的Unix的IO模型介绍,想必也了解到了5种IO模型。java的NIO是属于同步非阻塞IO,关于IO多路复用,java没有相应的IO模型,但有相应的编程模式,Reactor 就是基于NIO中实现多路复用的一种模式。本文将从以下几点阐述Reactor模式:reactor 是什么为何要用,能解决什么问题如何用,更好的方式其他事件处理模式 一、Reactor 是什么关于reactor 是什么,我...转载 2018-07-13 10:03:35 · 25462 阅读 · 4 评论