Nio Bio Netty Tomcat的NIO
socket():新建一个文件
bind():绑定到端口,第一个参数就是socket()方法产生的文件描述符
listen():确定新建的这个socket是一个服务器,被动等待网络其他进程链接,参数有个最大值:等待连接队列和成功连接队列之和的最大值
accept():如果绑定的端口上有新连接建立,那么为这个连接建立一个socket,或者说文件,返回一个描述符
为什么accept比select慢?accept是遍历连接,要阻塞等待每一个请求数据发送完,即socket文件可读
而select或者epoll直接读取可读的文件。
channel是干啥的?
其实ServerSocket和socket是对SocketImpl这个实现类的封装,SocketImpl才是真正的描述文件的类。而前两者的作用是封装和标志状态
ServerSocketAdaptor继承了 java.net.ServerSocket,有ServerSocketChannelImpl的引用。ServerSocketChannel的socket()方法返回的就是ServerSocketAdaptor,继承了java.net.ServerSocket并重写bind方法。
在socketChannel中,调用的是getImpl().bind(epoint.getAddress(), epoint.getPort());
在ServerSocketAdaptor中,调用的是ssc.bind(local, backlog);,其中ssc是ServerSocketChannelImpl的引用。
上面说了,nio的ServerSocketAdaptor是对bio的ServerSocket的封装,nio的ServerSocketChannelImpl和bio的SocketImpl是差不多的东西,都是对文件的被描述。nio的channel是对selector的适配
而netty的nioserversocketchannel是对nio的channel的封装:具体表现在:
用bootstrap的initAndRegister方法,返回的ChannelFuture(或者说其实现接口ChannelPromise)是对channel的封装
public class DefaultChannelPromise {
private final Channel channel;
}
,或者叫适配,因为实现了future接口,所以会对线程进行控制,调配等
而new出来的channel的构造方法是:
public NioServerSocketChannel() {
super(null, null, newSocket(), SelectionKey.OP_ACCEPT);
config = new DefaultServerSocketChannelConfig(this, javaChannel().socket());
}
先看其中的super
protected AbstractNioChannel(
Channel parent, Integer id, SelectableChannel ch, int readInterestOp) {
super(parent, id);
this.ch = ch;
this.readInterestOp = readInterestOp;
第三个参数是通过new socket()里面的方法是熟悉的nio的return ServerSocketChannel.open()---(new一个ssc)也就是说,ch这个属性里保存了nio的channelimpl;
这是一个装饰器模式
Nio Bio Netty Tomcat的NIO的更多相关文章
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- Eclipse中开发环境也想把Tomcat 的默认BIO模式改为NIO模式
1.1 问题 有时候,开发环境我们也想把Tomcat 的默认BIO模式改为NIO模式,该如何改呢? 1.2 方案 通过eclipse里面的server.xml进行修改. 1.3 步骤 首先我们来一起看 ...
- Tomcat配置NIO
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...
- Java异步NIO框架Netty实现高性能高并发
原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...
- NIO/BIO
NIO/BIO BIO网络通信 概述 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地 ...
- Java多线程:Linux多路复用,Java NIO与Netty简述
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: IOCP Free BSD, OS X: kqueue 下面仅讲解L ...
- 【Netty】netty学习之nio了解
[一]五种IO模型: (1)阻塞IO(2)非阻塞IO(任务提交,工作线程处理,委托线程等待工作线程处理结果的同时,也可以做其他的事情)(3)IO复用模型.(委托线程接收多个任务,将任务提交给工作线程. ...
- nio aio netty区别
传统io就是bio 同步阻塞 但可以采用伪同步 nio jdk1.7以前 同步非阻塞io 1.7以后 同步异步非阻塞 ...
- tomcat启动nio,apr详解以及配置
tomcat启动nio,apr详解以及配置 前言 在正文开始之前,我们先在idea工具中看看启动的信息,顺便看下启动的基本信息 在这里插入图片描述可以看到信息有tomcat版本操作系统版本java版本 ...
随机推荐
- Python自学:第二章 删除空白
lstrip:剔除开头空白 strip:剔除两段空白 rstrip:剔除末尾空白 favorite: 最喜欢的 >>>favorite_language = "Python ...
- 快速幂的求解-java方法(int范围之内)
思想就是,将十进制数化成二进制数.其它就是很简单了. 如:2的11次幂,11的二进制位1011,所以2(11) = 2(2(0) + 2(1) + 2(3)); 具体实现步骤,看代码比较简单 impo ...
- php字符串 统计个数
方法一 $arr=str_split($str); $arr=array_count_values($arr); /* * 方法二 * */ $arr = str_split($str); $a2 = ...
- Web 自动化测试框架 sweetest 介绍
项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...
- bzoj3529: [Sdoi2014]数表 莫比乌斯反演
题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...
- 【PowerDesigner】【5】数据模型 CDM
前言:各种箭头的含义其实我还是有点混乱,所以这里只做记录 参考博客: 1,Powerdesigner数据库建模--概念模型--ER图[转] - holycrap - 博客园https://www.cn ...
- 笔记react router 4(四)
看完Router的变化,接着来说<Switch>组件. 在3.X中,你可以指定很多子路由,但是只有第一个匹配的路径才会被渲染. 就像这样, <Route path='/' compo ...
- sharding-jdbc读写分离原理解读
原帖地址:https://blog.csdn.net/yanyan19880509/article/details/78170233 前言 很多时候,为了应付DB的高并发读写,我们会采用读写分离技术. ...
- PAT 1031 Hello World for U
1031 Hello World for U (20 分) Given any string of N (≥) characters, you are asked to form the char ...
- excel导入 导出
PHP页面 //设置header header("content-Type:text/html;charset=utf-8"); //设置文件大小的限制 ini_set(" ...