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的更多相关文章

  1. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)

    有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...

  2. Eclipse中开发环境也想把Tomcat 的默认BIO模式改为NIO模式

    1.1 问题 有时候,开发环境我们也想把Tomcat 的默认BIO模式改为NIO模式,该如何改呢? 1.2 方案 通过eclipse里面的server.xml进行修改. 1.3 步骤 首先我们来一起看 ...

  3. Tomcat配置NIO

    tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...

  4. Java异步NIO框架Netty实现高性能高并发

    原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...

  5. NIO/BIO

    NIO/BIO    BIO网络通信        概述            网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地 ...

  6. Java多线程:Linux多路复用,Java NIO与Netty简述

    JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: IOCP Free BSD, OS X: kqueue 下面仅讲解L ...

  7. 【Netty】netty学习之nio了解

    [一]五种IO模型: (1)阻塞IO(2)非阻塞IO(任务提交,工作线程处理,委托线程等待工作线程处理结果的同时,也可以做其他的事情)(3)IO复用模型.(委托线程接收多个任务,将任务提交给工作线程. ...

  8. nio aio netty区别

    传统io就是bio     同步阻塞         但可以采用伪同步 nio  jdk1.7以前     同步非阻塞io     1.7以后     同步异步非阻塞                  ...

  9. tomcat启动nio,apr详解以及配置

    tomcat启动nio,apr详解以及配置 前言 在正文开始之前,我们先在idea工具中看看启动的信息,顺便看下启动的基本信息 在这里插入图片描述可以看到信息有tomcat版本操作系统版本java版本 ...

随机推荐

  1. ubuntu14.04+MatlabR2014a+caffe

    一.下载matlab 1 sudo mkdir /media/matlab 2 sudo mount -o loop [path]MATHWORKS_R2014A.iso /media/matlab ...

  2. Confluence 6 空间

    什么是一个空间? Confluence 空间是包含有页面和博客页面的容器.你也可以将空间认为是对你工作中可以使用的 2 中类型的目录. 在 Confluence 中有下面 2 种空间类型: 站点空间( ...

  3. BottomNavigationBar使用详解

    gitHub地址:https://github.com/Ashok-Varma/BottomNavigation 一.基本使用 1.在AndroidStudio下添加依赖: compile 'com. ...

  4. 4月24 php基础及函数的应用

    PHP是一种被广泛认可应用,运行在服务端的脚本语言,PHP需要安转PHP应用程序服务器去解释执行,是用来协助Web服务器工作的编程语言,因此所写的任何代码只有在www文件下的才能实施预览.PHP是一种 ...

  5. 【其他】【服务器】【4】删除Windows系统中不想要的服务

    步骤: 1,开始菜单栏查找“服务”,打开后找到想要删除的服务 2,右键单击想要删除的服务,选择“属性”-“常规”-“服务名称”,记下服务名称(AA) 3,开始菜单栏输入“cmd”打开命令行窗口,输入s ...

  6. [转载]Python使用@property装饰器--getter和setter方法变成属性

    原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...

  7. NOIP2015神奇的幻方

    题目描述 幻方是一种很神奇的 N∗N 矩阵:它由数字1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第 ...

  8. ActiveMQ broker 集群, 静态发现和动态发现

    下载 activemq 压缩包解压后,conf 目录下有各种示例配置文件,红线标出的是静态发现和动态发现的配置. 1. 静态配置 启动3个 broker,端口分别为61616,61618,61620, ...

  9. Mysql锁(翻译)

    内容主要是对mysql文档的翻译. 1. shared(s) 共享锁2. exclusive(x) 排它锁 innodb的s锁和x锁是行级锁.事务T1获得s锁,事务T2仍然可以获得s锁.事务T1获得x ...

  10. c++ count函数

    count函数 algorithm头文件(#include <algorithm>)定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次 ...