1.Channel & Buffer
chanel类似于stream,它就是读写数据的双向通道,可以从chanel将数据读入buffer,也可以将buffer的数据写入chanel,而之前的stream要么是输入,要么是写入。
常见的chanel有
- FileChanel
- DatagramChanel
- SocketChanel
- ServerSocketChanel
buffer用来缓存读写数据,常见的有
- ByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
2.Selector
selector单从字面不好理解,需要结合服务器的设计演化来理解它的用途。
多线程版设计
一个socket连接就需要一个线程来处理,在数量少的情况下可以,但在数量大的时候其开销很大,内存占用高,线程上下文切换成本高。
线程池版设计
一个线程可以处理多个socket连接,但是它也有缺点,在阻塞模式下,线程仅能处理一个socket连接,即使socket此时为阻塞,thread也不能处理其他socket。只有当这个socket断开后,才会处理其他socket,仅适合socket为断连接的场景。
selector版设计
selector的作用就是配合一个线程来管理多个socket,获取这些socket上发生的事件, selector获取socket发起的请求让thread来处理,不让一个thread吊死在一个socket上。(即一个socket处于阻塞状态下,selector会让thread去处理其它socket)