netty 可以做什么
- 可以作为 HTTP 服务器 ,类似 TomCat 等。但是 netty 相对于 Spring 等技术更为底层,处理速度也跟快,但是开发时间长。比如 netty 不支持:路由转发。
- Socket 开发。底层数据的传输,HTTP 是基于 TCP 的应用层的协议。微服务。
- 支持长连接的开发,相对于 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 | public stattic void main(String[] args){ |
上面的程序就会输出十个 0 - 20 的随机数。在读写之间通过调用 filp()
方法实现转换。