————————————————————————————————
——————————————————————————————————
一、什么是Netty:
二、Netty使用场景:
websocket 客户端js 脚本实现
js 结构
具体实现
关闭连接
发送消息
绑定时间
效果
客户端代码,html
框架
websocket 启动类的实现
框架
具体实现
websocket 初始化连接时各个组件的实现
实现websocket 连接
处理客户端与服务端之间的websocket 的业务
先处理其他情况
处理消息
判断是否是二进制消息,是就抛出异常,暂不支持二进制消息
获取发送的消息
群发消息
处理websocket 的接收消息处理方法
websocket 握手请求业务的实现
先定义两个属性
处理握手请求的业务
处理客户端向服务端发起http 握手请求的业务
服务端向客户端响应消息的方法
websocket
核心业务处理类
要继承SimpleChannelInboundHandle
要重写以下几个方法
如下
具体使用方法
保存channel
移除channel
接收数据结束
打印错误,并关闭链接
服务端websocket
全局配置类
websocket 入门
先用http 进行握手请求,然后用socket 建立连接,之后就不需要用http 的参与
websocket 的优点
websocket 建立连接
websocket 生命周期
websocket 关闭连接,两种方式,一般应该基于服务器关闭
原生nio 的缺点
JDK NIO bug
使用IO复用,Linux下一般默认就是epoll,Java NIO在Linux下默认也是epoll机制,但是JDK中epoll的实现却是有漏洞的,其中最有名的java nio epoll bug就是即使是关注的select轮询事件返回数量为0,NIO照样不断的从select本应该阻塞的Selector.select()/Selector.select(timeout)中wake up出来,导致CPU 100%问题。
Netty 优势
阿里巴巴的分布式框架dubbo,就使用了netty 作为底层框架,其他rpc 框架很多也是用netty
BIO 通信
一线程对一客户端
伪异步IO 通信
nio通信
aio 通信
四种io 对比
什么是netty
netty 的使用场景
NIO 通信
Java IO 通信
Netty
Java Web 开发
TCP close 高延迟,数据一致性
# Web 实时通信方案 All In One
HTTP 轮询, 单向通信,开销大
HTTP 长轮询, 单向通信,开销较小
WebSocket,双向通信,开销最小
Server Push,单向通信,开销较小
WebRTC 实时音频,视频,H5 直播
https://github.com/MyCATApache/Mycat-Server
首先,使用 HTTP 协议,建立连接
后面,使用 WS 协议,进行通信
bio通信的特点
使用的场景
netty介绍
BIO 同步阻塞IO
伪异步IO通信(线程池处理)
NIO 同步非堵塞IO
AIO 异步非堵塞IO
一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
同步阻塞IO:在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!
同步非阻塞IO:在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!
异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。
BIO是一个连接一个线程。
NIO是一个请求一个线程。
AIO是一个有效请求一个线程。
1111111
1:BIO 服务端一个线程会负责一个连接,进行请求的处理和响应,比较明显,当客户端比较多的时候,服务端的线程可能就不够了,这时候对应的请求就没法及时处理了
客户端个数:服务端处理线程个数=1:1
IO类型:阻塞同步
API使用难度:简单
调试难度:简单
WebSocket建立连接
客户端发起握手请求
服务端响应请求
连接建立
NIO 所有的数据都是通过缓冲区处理的,通道Channel 。Selector 轮询Channel
WebSocket:H5协议规范、握手机制、解决客户端与服务端实时通信而产生的技术
本质上是基于TCP的协议
服务端与客户端通过此TCP连接进行实时通信,当WebSocket客户端与服务器端进行通讯以后,此时就不再需要之前进行握手请求的HTTP协议的参与了