Netty初体验
Updated:
Netty入门
- 什么是Netty?
- 是一个Java IO开源框架
- 高性能事件驱动、异步非堵塞
- 由JBoss提供,用于建立底层的TCP等连接
- 可用来快速开发高性能客户端和网络服务器
- 基于NIO的客户端,服务端编程框架
- 提供了良好的稳定性和伸缩性
- Netty的使用场景
- 高性能领域
- 游戏、大数据分布式计算等
- 多线程并发领域
- 异步通信领域
- 高性能领域
IO通信
- BIO通信
- 特点 :
- 阻塞同步IO
- 由一个线程负责连接
- 一请求一应答模式
- 缺乏弹性伸缩能力
- 简单来说差不多就是这样的 :
- 特点 :
- 伪异步IO通信
- 特点 :
- 阻塞同步IO
- 由线程池负责连接
- M请求N应答模式
- 可能造成线程池阻塞
- 图示 :
- 特点 :
- NIO通信
- 特点 :
- 非阻塞同步IO
- 通过缓冲区Buffer处理流数据
- 由Channel读取或写入网络数据
- 多路复用器Selector :
- 若某个Channel上发生了读或写事件,则称为就绪状态
- Selector即负责不断轮询,以找到处于就绪状态的Channel们
- 再通过SelectionKey获取就绪Channel的集合,以进行后续操作
- 通道与流的区别 :
- 通道是双向的,流是单向的
- 流只能在某一方向进行读操作或写操作
- 但通道即能读又能写,甚至可以同时进行
- 特点 :
- AIO通信
- 特点 :
- 非阻塞异步IO
- 连接注册读写事件和回调函数
- 读写方式异步
- 主动通知程序
- 备注 :
- 真正的异步非阻塞IO
- 不需要通过Selector轮询即可实现异步读写
- 特点 :
Netty与原生NIO的对比
- 原生NIO :
- 类库和API繁杂
- 入门门槛高
- 工作量和难度大
- 存在典型bug(如epoll空轮询等)
- Netty :
- API简单,可扩展性强
- 入门门槛低
- 性能高
- 成熟、稳定
WebSocket入门
- 什么是WebSocket?
- H5提出的协议规范
- 基于握手机制来建立连接
- 为解决客户端与服务器实时通信而产生
- 本质上是一个基于ICP的协议,是通过HTTP/HTTPS协议发起一条特殊的HTTP请求,进行握手后创建一个用于交换数据的TCP连接;此后,服务端和客户端便可通过此TCP连接进行实时通信(就不需要之前那条进行握手请求的HTTP参与了)
- WebSocket特点 :
- 节省通信开销(因为轮询需要不断向服务器发送请求,而即使是只发送一条很小的信息,也必须把不短的HTTPRequestHeader完整送出,这样就会占用不必要的带宽和服务器资源)
- 服务器主动传送数据给客户端
- 实时通信
- WebSocket连接建立 :
- 客户端发起握手请求
- 服务端响应请求
- 建立连接
- WebSocket生命周期 :
- 打开(open)事件 :
- 发生在新连接建立之时、其他事件发生之前
- 伴随着三部分信息 :webSocketSession对象(用于表示已经建立好的连接)、配置对象(包含了用来配置端点的信息),及一组路径参数(用来打开阶段握手时WebSocket端入站时匹配的URI)
- 消息(message)事件 :
- 主要用来接收WebSocket对话中另一端发送的消息
- 消息将以三种基本形式抵达 :文本消息、二进制消息、Pong消息
- 一般使用带String参数的方法处理文本消息;使用带Buffer或数组参数的方法处理二进制文本;使用PongMessage接口实例处理Pong消息
- 错误(error)事件 :
- 在WebSocket连接或端点发生错误时产生
- 可以处理WebSocket实现入站时发生的各种异常
- 三种基本错误类型 :WebSocket建立连接时 :SessionException;试图将入站消息解码成开发人员所需要的对象时 :DecodeExceptiom;由WebSocket端点产生的其他运行时错误等
- 关闭(close)事件 :
- 可由参与连接的任意一个端点发出
- 表示此次WebSocket连接关闭
- 打开(open)事件 :
- WebSocket连接关闭 :
- 两种方式 :
- 服务器关闭底层TCP连接(正常)
- 客户端发起 TCP Close(异常)
- 所以说一般是由服务器发起TCP Close操作,客户端等待关闭就好
- 两种方式 :