202108-31 浅析NIO系列之TCP 目录一、前言二、TCP特性三、IP网络层为何不保证数据包的可靠性四、TCP协议4.1、TCP包组成4.2、如何保证可靠性五、流量控制5.1、滑动窗口5.2、拥堵控制六、TCP状态七、消失的连接——TIME_WAIT一、前言在springboot2中,默认的web容器是netty,这说明“反应式”容器已经是大势所趋,无论是go语言的协从线程,还是java基于reactor线程模型,都是基于事件编程实现高并发的实例。在介绍NIO之前有必要了解下TCP协议,因为目... 继续阅读 >
202108-06 浅谈Java中IO和NIO的本质和区别 目录IO的本质DMA和虚拟地址空间IO的分类IO和NIO的区别IO的本质IO的作用就是从外部系统读取数据到java程序中,或者把java程序中输出的数据写回到外部系统。这里的外部系统可能是磁盘,网络流等等。因为对所有的外部数据的处理都是由操作系统内核来实现的,对于java应用程序来说,只是调用操作系统中相应的接口方法,从而和外部数据进行交互。所有IO的本质就是对Buffer的处理,我们把数据放入Buffer供系统写入外部数据,或者从系统Bu... 继续阅读 >
202107-26 一文学习Java NIO的ByteBuffer工作原理 目录1API2Netty的数据容器2.1工作原理内存池化非池化的堆内与堆外的ByteBuf池化的堆内与堆外的ByteBuf字节级操作派生缓冲区slice、slice(int,int)、retainedSlice、retainedSlice(int,int)duplicate、retainedDuplicatereadSlice、readRetainedSlice网络数据的基本单位永远是byte(字节)。JavaNIO提供ByteBuffer作为字节的容器,但该类过于复杂,有点难用。ByteBuf是Netty当中的最重要的工具类,它与JDK的ByteBuffer原... 继续阅读 >
202107-12 Java非阻塞I/O模型之NIO相关知识总结 组件说明(1)Channel:NIO模型中的管道,管道是链接建立和通信的重要组件,我们可以理解管道是一个容器环境,我们所有的I/O的建立读取都可以在这个容器中进行(2)Selector:NIO中的选择器,NIO是由事件驱动的,当有链接事件或者读取事件发生时,这个事件可以注册到这个选择器上,并且最终被我们检测到。(3)SelectionKey:我们可以在Selector中进行检测是否有SelectionKey产生,并且根据这个SelectionKey中的信息判断时什么事件... 继续阅读 >
202106-04 java基础之NIO介绍及使用 一、NIOjava.nio全称javanon-blockingIO,是指jdk1.4及以上版本里提供的新api(NewIO),为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。二、三大组件NIO三大组件:Channel、Buffer、Selector1.Channel和BufferChannel是一个对象,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流,而且他们面向缓冲区(Buffer)的。所有数据都通过Buffer对象来... 继续阅读 >
202105-02 java中BIO、NIO、AIO都有啥区别 一、BIO(BlockingIO,也被称作oldIO)同步阻塞模型,一个客户端连接对应一个处理线程对于每一个新的网络连接都会分配给一个线程,每隔线程都独立处理自己负责的输入和输出,也被称为ConnectionPerThread模式缺点:1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源2、如果线程很多,会导致服务器线程太多,压力太大,比如C10K问题所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,... 继续阅读 >
202101-13 Java NIO 文件通道 FileChannel 用法及原理 FileChannel提供了一种通过通道来访问文件的方式,它可以通过带参数position(int)方法定位到文件的任意位置开始进行操作,还能够将文件映射到直接内存,提高大文件的访问效率。本文将介绍其详细用法和原理。1.通道获取FileChannel可以通过FileInputStream,FileOutputStream,RandomAccessFile的对象中的getChannel()方法来获取,也可以同通过静态方法FileChannel.open(Path,OpenOption...)来打开。1.1从FileInputS... 继续阅读 >
202010-21 Java NIO无法绑定指定IP和端口解决方案 在使用SNMP4J时,我想指定创建的客户端使用的本地IP和端口,因为在Socket时这是可以的,但是发现无法实现因为SNMP4J底层的通信是使用NIO实现的,而NIO编程时貌似就不能显示的指定例如在SNMP4J的DefaultTcpTransportMapping类里面,当作为客户端需要发送消息时,程序首先判断是否创建了这个客户端,如果没有在创建时看到这样的代码:SocketChannelsc=null;try{sc=SocketChannel.open();sc.configureBlocking(false);sc.con... 继续阅读 >
202010-10 Java BIO,NIO,AIO总结 Java中的BIO、NIO和AIO理解为是Java语言对操作系统的各种IO模型的封装。程序员在使用这些API的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。在讲BIO,NIO,AIO之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。同步与异步同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。异步:异步就是发起一个调用后,立刻得到... 继续阅读 >
202010-10 Java NIO异步文件通道原理及用法解析 在Java7,AsynchronousFileChannel被添加到了JavaNIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。创建一个AsynchronousFileChannel我们可以使用AsynchronousFileChannel提供的静态方法open()创建它。示例代码如下:Pathpath=Paths.get("data/test.xml");AsynchronousFileChannelfileChannel=AsynchronousFileChannel.open(path,StandardOpenOption.READ);第一个参数是一个PATH的对像实例,它... 继续阅读 >
202010-08 深入了解java NIO之Selector(选择器) 这一节我们将探索选择器(selectors)。选择器提供选择执行已经就绪的任务的能力,这使得多元I/O成为可能。就像在第一章中描述的那样,就绪选择和多元执行使得单线程能够有效率地同时管理多个I/O通道(channels)。C/C++代码的工具箱中,许多年前就已经有select()和poll()这两个POSIX(可移植性操作系统接口)系统调用可供使用了。许过操作系统也提供相似的功能,但对Java程序员来说,就绪选择功能直到JDK1.4才成为可行的方... 继续阅读 >
202010-08 详解java NIO之Channel(通道) 通道(Channel)是java.nio的第二个主要创新。它们既不是一个扩展也不是一项增强,而是全新、极好的JavaI/O示例,提供与I/O服务的直接连接。Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。channel介绍通道是访问I/O服务的导管。I/O可以分为广义的两大类别:FileI/O和StreamI/O。那么相应地有两种类型的通道也就不足为怪了,它们是文件(file)通道和套接字(socket)通道。我们... 继续阅读 >
202010-08 详细了解JAVA NIO之Buffer(缓冲区) 当我们需要与NIOChannel进行交互时,我们就需要使用到NIOBuffer,即数据从Buffer读取到Channel中,并且从Channel中写入到Buffer中。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIOBuffer对象,并提供了一组方法,用来方便的访问该块内存。缓冲区基础Buffer类型有:缓冲区是包在一个对象内的基础数据的数组,Buffer类相比一般简单数组而言其优点是将数据的内容和相关信息放在一个... 继续阅读 >
202010-08 简单了解JAVA NIO I/O简介在Java编程中,直到最近一直使用流的方式完成I/O。所有I/O都被视为单个的字节的移动,通过一个称为Stream的对象一次移动一个字节。流I/O用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。JavaNIO即JavaNon-blockingIO(Java非阻塞I/O),因为是在Jdk1.4之后增加的一套新的操作I/O工具包,所以一般会被叫做JavaNewIO。NIO是为提供I/O吞吐量而专门设计,其卓越的性能甚至可以与C... 继续阅读 >
202009-29 Java使用BIO和NIO进行文件操作对比代码示例 什么是JavaNIO?同步非阻塞io模式,拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。JavaNIO有三大组成部分:Buffer,Channel,Selector,通过事件驱动模式实现了什么时候有数据可读的问题。什么是JavaBIO?同步阻塞IO模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧... 继续阅读 >
202009-24 Java实现基于NIO的多线程Web服务器实例 代码地址:https://github.com/iyuanyb/webserver实现了静态、动态资源获取;Cookie、Session、HTTP长连接,及Session和HTTP长连接的定时清除;类似SpringMVC的注解式编程,如@RequestMapping@RequestParam等,方法中可以根据参数名从前台获取数据,可以传递对象,也支持级联属性,如://GET/page?pageSize=10&pageNum=1HTTP/1.1@RequestMapping("/page")Stringpage(@RequestParam(value="pageSize",defaultVa... 继续阅读 >