WebSocket介绍
WebSocket是一种网络通讯协议,从Html5开始支持的一种在单个 TCP 连接上进行双向通信的协议。
HTTP协议是一种无状态的、无连接的、单向的应用层协议,通信请求只能由客户端发起,服务端对请求作出应答处理,http协议无法实现服务器主动向客户端发送消息。
这种单向请求的特点,如果服务器有连续的转态发生变化,客户端要获知就非常的麻烦,在以前的解决方案是通过频繁的异步ajax请求实现长轮询,但轮询的效率低,而且非常浪费性能(因为必须不停的连接)
http协议:
WebSocket协议:
WebSocket协议
本协议有两部分:握手和数据传输。
握手是基于http的
来自客户端握手(类似如下形式):
GET ws://localhost/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGh1IHNhbXBZSBub25jZQ==
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Version: 13
来自服务端握手(类似如下形式):
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9KYGzzhZRbK+xOo==
Sec-WebSocket-Extensions: permessage-deflate
字段说明
头名称 | 说明 |
---|---|
Connection: Upgrade | 标识该HTTP请求时一个协议升级请求。 |
Upgrade: websocket | 协议升级为WebSocket协议 |
Sec-WebSocket-Version: 13 | 版本号 |
Sec-WebSocket-Key | 客户端采用base64编码的24位随机字符序列,服务端接受客户端HTTP协议升级的证明,要求服务端响应一个对应加密的Sec-WebSocket-Accept头信息作为应答。 |
Sec-WebSocket-Extensions | 协议扩展类型 |
客户端(浏览器)实现
WebSocket对象
浏览器通过 WebSocket 对象公开所有必须的客户端功能(支持HTML5的浏览器)
// url(以ws开头): ws://ip:port/资源名称
var ws = new WebSocket(url);
WebSocket事件和方法
事件
事件 | 描述 |
---|---|
onopen | 连接建立时触发 |
onmessage | 接受到服务端数据时触发 |
onerror | 通信发生错误时触发 |
onclose | 连接关闭时触发 |
方法
方法 | 描述 |
---|---|
send() | 向服务端发送数据 |
服务端(Java)实现
从Tomcat7.0.5版本开始支持WebSocket,Java WebSocket应用由一系列的WebSocketEndpoint组成,Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口,就像Servlet与http请求一样。
有如下两种方式定义Endpoin:
- 编程式:即继承 javax.websocket.Endpoint 类,并实现其方法。
- 注解式:定义一个POJO,并添加@ServerEndpoint相关注解。
Endpoint实例在WebSocket握手时创建,在客户端与服务端链接过程中有效,在链接关闭时结束
生命周期方法如下:
方法 | 含义描述 | 对应注解 |
---|---|---|
onOpen | 当开启一个新的会话时调用,客户端与服务端握手成功后调用 | @onOpen |
onClose | 当会话关闭时调用 | @onClose |
onError | 当连接过程中出现异常时调用 | onError |