netty基础

netty 可以做什么

  1. 可以作为 HTTP 服务器 ,类似 TomCat 等。但是 netty 相对于 Spring 等技术更为底层,处理速度也跟快,但是开发时间长。比如 netty 不支持:路由转发。
  2. Socket 开发。底层数据的传输,HTTP 是基于 TCP 的应用层的协议。微服务。
  3. 支持长连接的开发,相对于 HTTP 1.0 的无状态和短连接。消息推送,在线聊天,服务端向客户端推送消息。

NIO 与 IO

Java.io 中 最为重要的一个概念是 流(Stream)。一个流要么是输入流,要么是输出流。不可能同时又是输入又是输出。

在 java.io 中流大致可以分为节点流和过滤流。使用 装饰模式来增强一个节点流的功能。


Java.nio 中引入了3个核心概念:selector,Channel和Buffer。在 Java.nio 中是面向块(block)和缓冲区(buffer)编程的。

Java中的8种原生类型,除了 Boolean 都有各自对应的 buffer 类型,如 IntBuffer,LongBuffer等等。而 nio 中所有数据的读写都是通过 Buffer(由数组实现) 来实现的,Channel 则是可以读取或者写入 Buffer 的一个对象,永远不会出现直接向 Channel 中读写数据。

NIO 中 Buffer 类又三个 重要的属性,capacity,limit,position

  • capacity:代表一个 Buffer 的容量大小,一旦指定以后就不能改变。
  • limit:代表 Buffer 中第一个不能读写数据的索引,代表当前索引位置是没有元素的,limit 永远不能大于 capacity。
  • position:代表当前读写元素的下一个可读写元素的索引。每次读写元素之后 position 会加一。position 是永远不能大于 limit的。

由于 Buffer 是支持读写操作的。所以在读写转换的时候需要调用 filp() 方法改变 Buffer 中的属性。在调用前后,capacity 是不会改变的;limit 改变为之前 position 的位置;position 变为 0。

对于 NIO 的具体使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public stattic void main(String[] args){
//申请 10 大小的 buffer
IntBuffer buffer = IntBuffer.allocate(10);
//向 buffer 中写入数据
for(int i = 0;i < buffer.capacity();i++){
int random = new SecureRandom().nextInt(20);
buffer.put(random);
}
//读写转换
buffer.filp();
//从 buffer 中读出数据
while(buffer.hasRemaining()){
System.out.println(buffer.get());
}
}

上面的程序就会输出十个 0 - 20 的随机数。在读写之间通过调用 filp() 方法实现转换。