Socket是啥?
- TCP/IP协议族通信的中间软件抽象层,是一组接口即使门面模式。TCP用注解的ip+端口号,作为TCP连接的端点,这个端点叫做套接字socket。
BIO
- 同步阻塞式IO,ServerSocket负责绑定ip,启动监听端口,起一个线程让socket负责发起连接。
NIO
- 非阻塞IO,客户端和服务器通过channe通讯、实现多路复用
- 什么是IO事件?
- 表示通道某种IO操作已经就绪、或者说已经做好了准备。一个Channel通道如果有数据可读,就会发生一个IO事件,代表该连接数据已经准备好,这个IO事件叫做“读就绪”事件。
- SelectionKey.OP_CONNECT
- SelectionKey.OP_ACCEPT
- SelectionKey.OP_READ
- SelectionKey.OP_WRITE
- IO多路复用?
- 是指一个线程/进程 可以同时监视多个文件描述符(含socket连接),一旦其中的一个或者多个文件描述符可读或者可写,该监听进程/线程能够进行IO事件的查询。怎么对多个文件描述符进行监听呢?elector选择器
- Selector选择器
- 事件订阅器、轮询代理器、channel容器管理机
- IO多路复用的实现
- 1、是把通道注册到选择器中
- 2、通过选择器提供的事件查询(select)方法,查询这个注册的通道是否已经有就绪的IO事件。
- 3、由于一个选择器只需要一个线程进行监控,所以只要一个简单的线程去管理多个连接通道
-
优点 相比NIO,不必为每一个网络连接创建一个线程。一个线程负责多个连接通道的IO处理。
-
Channel管道
- Channel和Stream的一个显著的不同是:Stream是单向的,譬如InputStream是单向的只读流,OutputStream是单向的只写流;而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。
buffer缓冲区
- buffer的子类会拥有一块内存作为数据的读写缓冲区,具体实现是 byte数组
- capacity 、position、limit
- allocate()创建缓冲区,比如IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(20),创建了一个Intbuffer实例对象,并且分配了20*4个字节的内存空间
- put()写入到缓冲区 创建了一个Intbuffer实例对象,并且分配了20*4个字节的内存空间
- flip() 模式转换
- get()从缓冲区读取
- rewind()倒带,已经读完的数据,如果需要再读一遍,可以调用rewind()方法。
- clear( )清空缓冲区
buffer类的基本步骤
- 创建子类实例对象的allocate,创建一个buffer类的 实例对象
- 调用put写入缓冲区
- buffer.flip 切为读模式
- get 拿数据
- 读完之后clear或者compact
Channel 管道
(1)FileChannel文件通道,用于文件的数据读写;
(2)SocketChannel套接字通道,用于Socket套接字TCP连接的数据读写;
(3)ServerSocketChannel服务器套接字通道(或服务器监听通道),允许我们监听TCP连接请求,为每个监听到的请求,创建一个SocketChannel套接字通道;
(4)DatagramChannel数据报通道,用于UDP协议的数据读写。
文件IO、TCP IO 、UDP IO
获取 读取 写入 关闭