nio

tomcat的Connector和三种运行模式

倾然丶 夕夏残阳落幕 提交于 2020-03-30 19:28:03
一、Connector 在Tomcat架构中,Connector主要负责处理与客户端的通信。Connector的实例用于监听端口,接受来自客户端的请求并将请求转交给Engine处理。同时将来自Engine的答复返回给客户端。 Connector的种类 Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类: Http Connector, 基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。 默认情况下,Tomcat使用的就是这个Connector。 AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度和效率。 如与Apache服务器集成时,采用这个协议。 APR HTTP Connector, 用C实现,通过JNI调用的。主要提升对静态资源(如HTML、图片、CSS、JS等)的访问性能。现在这个库已独立出来可用在任何项目中。 Tomcat在配置APR之后性能非常强劲。 tomcat中实现了以下几种Connector: #以上三种Connector实现都是直接处理来自客户端Http请求 org.apache

Java IO模型:BIO、NIO、AIO

不想你离开。 提交于 2020-03-30 06:51:17
Java IO模型:BIO、NIO、AIO 本来是打算直接学习网络框架Netty的,但是先补充了一下自己对Java 几种IO模型的学习和理解。分别是 BIO、NIO、AIO三种IO模型。 IO模型的基本说明 BIO模型图 缺点: 如果有很多个Client,则会产生很多个线程。压力主要是在服务器端。客户端的压力并不大。 另外建立连接之后,并不是在时时刻刻的使用。会有空间时间。 会阻塞。 NIO模型图 特点: 事件驱动 多路复用 Netty底层使用的NIO模型 AIO模型 目前还未得到广泛运用。异步非阻塞。先了解就可以。 BIO、NIO、AIO使用场景分析 BOI方式使用与连接数目比较小固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。JDK1.4以前的唯一选择。但是程序简单容易理解。 NIO方式适用于 连接数目多且连接比较短 (轻操作)的架构,比如聊天服务器,弹幕系统,服务期间通讯等。编程比较复杂,JDK1.4开始支持。 AIO方式适用于 连接数目多且连接比较长 (重操作)的架构,比如相册服务器,充分调用OS操作系统参与并发操作,编程比较复杂,JDK7开始支持。但是目前还未得到广泛运用。 JAVA BIO编程 JAVA BIO 基本介绍 JAVA BIO 工作机制 JAVA BIO 应用实例 package com.dawa.netty.bio; import com

NIO之Channel、Buffer

萝らか妹 提交于 2020-03-28 16:30:53
前言 Java NIO 由以下几个核心部分组成: 1 、Buffer 2、Channel 3、Selector 传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方。 NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据。 本文着重介绍Channel和Buffer的概念以及在文件读写方面的应用和内部实现原理。 Buffer A buffer is a linear, finite sequence of elements of a specific primitive type. 一块缓存区,内部使用字节数组存储数据,并维护几个特殊变量,实现数据的反复利用。 1、 mark :初始值为-1,用于备份当前的position; 2、 position :初始值为0,position表示当前可以写入或读取数据的位置,当写入或读取一个数据后,position向前移动到下一个位置; 3、 limit :写模式下,limit表示最多能往Buffer里写多少数据,等于capacity值;读模式下,limit表示最多可以读取多少数据。 4、 capacity :缓存数组大小 mark() :把当前的position赋值给mark public final Buffer mark() { mark =

Reactor模型

半世苍凉 提交于 2020-03-25 16:43:13
要无障碍阅读本文,需要对NIO有一个大概的了解,起码要可以写一个NIO的Hello World。 说到NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,但是好多人在学习的时候,往往会忽视基础的学习,一上来就是Netty,各种高大上,但是却没有静下心来好好看看Netty的基石——Reactor模型。本文就带着大家看看Reactor模型,让大家对Reactor模型有个浅显而又感性的认识。 说到Reactor,不得不提到一篇文章,文章作者是大名鼎鼎的Doug Lea,Java中的并发包就是出自他之手,下面我试着从文章中挑出一些重要的内容,结合我的理解,来说说Reactor模型,看看Doug Lea大神的脑回路是多么的与众不同。 经典的服务设计 这是最为传统的Socket服务设计,有多个客户端连接服务端,服务端会开启很多线程,一个线程为一个客户端服务。 在绝大多数场景下,处理一个网络请求有如下几个步骤: read:从socket读取数据。 decode:解码,因为网络上的数据都是以byte的形式进行传输的,要想获取真正的请求,必定需要解码。 compute:计算,也就是业务处理,你想干啥就干啥。 encode:编码,同理,因为网络上的数据都是以byte的形式进行传输的,也就是socket只接收byte,所以必定需要编码。 下面我们来看看传统的BIO代码:

nio--自己总结

纵饮孤独 提交于 2020-03-25 15:42:29
阻塞/非阻塞 + 同步/异步 其实,这两者存在本质的区别,面向的对象是不同的。 阻塞/非阻塞:进程/线程需要操作的数据如果尚未就绪, 是否妨碍了当前进程/线程的后续操作 。 同步/异步:数据如果尚未就绪, 被调用方是否需要拿到数据结果再返回 。 reactor: 通知我有就绪状态了, preactor:通知我数据已经从内核拷贝到了用户空间。 1.同步与异步 同步和异步关注的是 消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由*调用者*主动等待这个*调用*的结果。 而异步则是相反, *调用*在发出之后 ,这个调用就直接返回了,所以没有返回结果 。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。 典型的异步编程模型比如Node.js 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊

NIO基础

≯℡__Kan透↙ 提交于 2020-03-25 02:52:35
通道和缓冲区 概述 通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/O 操作中都要使用它们。 通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。 在本节中,您会了解到 NIO 中通道和缓冲区是如何工作的。 来源: https://www.cnblogs.com/shunliu-java/p/4186187.html

Java NIO

雨燕双飞 提交于 2020-03-25 02:52:13
1.简述 java nio是java SE 1.4引进的非阻塞IO,提供了一系列的新的API,不同于之前的阻塞IO。在缓冲管理、可伸缩的网络和文件IO、字符集支撑方面得到了显著提高。 主要位于java.nio包中,nio模块主要由以下几个部分组成: Buffer(缓冲区) Channel(通道) Selector(选择器) Charset(字符集) 下面就从这个几个核心来简单说说java的nio,但这里不对四大核心做过多详细的说明和操作,这部分会在后续的文章中逐一详述。 2.Buffer Buffer本质上是一块连续的内存空间,用来作为数据容器。与传统的阻塞IO不同,在阻塞IO中数据都是面向流的读写,但是在nio中都是基于Buffer进行数据的读写操作,即从Buffer中读数据和将数据写进Buffer,如下图: 3.Channel Channel代表着连接的实体可进行IO操作。通道的本质就是一种实体,可连接到IO操作。有点类似传统IO中的Stream,在nio中具有多种类型,后续文章中会详细说明。 Channel与Stream不同,它是双向的,即可以进行读写,而Stream是单向的,要么读要么写。 Channel的读写都是非阻塞的,但是Stream中的读写是阻塞。 4.Selecttor Selector代表着多路选择器,是多路复用应用的关键所在。上述的可选择性通道

JAVA NIO

半腔热情 提交于 2020-03-25 02:51:54
一、使用 NIO 复制文件 package javanio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Scanner; public class CopyFile { public static void main(String[] args) throws IOException { CopyFile cf = new CopyFile(); cf.startCopy(); } public void startCopy() throws IOException { /* 默认目标文件路径, "." 表示在当前工程目录下 */ String des = ".\\src\\javanio\\Test.txt"; System.out.println("请输入源文件路径:"); Scanner sc = new Scanner(System.in); String src = sc.next(); sc.close(); File

JAVA NIO

删除回忆录丶 提交于 2020-03-24 22:35:56
转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?opt=1 我们在学习的过程中可以形成自己的代码库,即将一些常用的类,函数,接口,配置文件等单独拎出来,下次使用时直接复制过来,这样就可以重复造轮子,早点下班回家。 java NIO是一个高效的处理文件的API, 比传统文件流要高效许多。 public class MyFileTools { public void copyFile(String inFile,String outFile,boolean tail){ FileInputStream fin = null; FileOutputStream fout = null; FileChannel fcin = null; FileChannel fcout = null; try { fin = new FileInputStream(inFile); fout = new FileOutputStream(outFile,tail); fcin = fin.getChannel(); fcout = fout.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(true){ buffer.clear(); int read = fcin.read

Java NIO类库Selector机制解析

和自甴很熟 提交于 2020-03-23 14:03:49
一、 前言 自从 J2SE 1.4 版本以来, JDK 发布了全新的 I/O 类库,简称 NIO ,其不但引入了全新的高效的 I/O 机制,同时,也引入了多路复用的异步模式。 NIO 的包中主要包含了这样几种抽象数据类型: Buffer :包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的 I/O 操作。 Charset :它提供 Unicode 字符串影射到字节序列以及逆映射的操作。 Channels :包含 socket , file 和 pipe 三种管道,都是全双工的通道。 Selector :多个异步 I/O 操作集中到一个或多个线程中(可以被看成是 Unix 中 select() 函数的面向对象版本)。 我的大学同学赵锟在使用 NIO 类库书写相关网络程序的时候,发现了一些 Java 异常 RuntimeException ,异常的报错信息让他开始了对 NIO 的 Selector 进行了一些调查。当赵锟对我共享了 Selector 的一些底层机制的猜想和调查时候,我们觉得这是一件很有意思的事情,于是在伙同赵锟进行过一系列的调查后,我俩发现了很多有趣的事情,于是导致了这篇文章的产生。这也是为什么本文的作者署名为我们两人的原因。 先要说明的一点是,赵锟和我本质上都是出身于 Unix/Linux/C/C++ 的开发人员,对于 Java