是一种网络通信协议,遵循RFC6455标准
由html5提供的一种在单个Tcp连接上的进行的全双工通讯的协议。
http协议:
无状态,无连接,一种单向应用层协议,请求&响应的模型 。
通信只能由客户端发起,服务端对请求作出应答处理。
所以http有无法实现服务器主动向客户端发起消息的弊端
这种单向请求的特点,注定了如果服务器有连续的状态变化客户端要获知就非常麻烦,大多数Web应用程序将通过频繁的异步通信AJAX请求实现长轮询,轮询的效率低,非常浪费资源(因为要不停地连接,或者http连接要一直打开)。
WebSocket协议分为两部分,一是客户端与服务端之间先“握手”,二才是进行数据交互。
握手是基于http协议的
来自客户端的握手例如:
GET ws://localhost/chat HTTP/1.1
Host:local host
Upgrade:websocket
Connection: Upgrade
Sec-WebSocket-Key: dGh1IHNhbXBsZBub25jzQ==
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Version:13
来自服务器的握手例如:
HTTP/1.1 101 Switching Protocols
Upgrade:websocket
Connection: Upgrade
Sec-WebSocket-Key: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate
头名称 | 作用说明 |
Connection:Upgrade | 标识该htpp请求是一个协议升级请求 |
Upgrade:WebSocket | 协议升级为WebScoket协议 |
Sec-WebSocket-Version | 客户端支持WebSocket的版本 |
Sec-WebSocket-Key | 客户端采用base64编码的24位随机字符序列,服务器接收客户端http协议升级的证明,要求服务器响应一个对应加密的Sec-WebSocket-Accept头信息作为应答 |
Sec-WebSocket-Extensions | 协议扩展类型 |
如何使用?
创建
var ws=new WebSocket(url);
参数url格式:ws://ip地址:端口号/资源名称
事件
事件 | 处理 | 描述 |
open | websocket对象.onpen | 连接建立时触发 |
message | websocket对象.onmessage | 客户端接收服务端数据时触发 |
error | websocket对象.onerror | 通信发生错误时触发 |
close | websocket对象.onclose | 连接关闭时触发 |
对象方法
send()//使用连接发送数据
服务端实现
Tomcat的7.0.5开始支持WebSocket,使用JSR365规范
Java WebSocket应用由一系列的WebSocketEndpoint组成,Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端可以视为处理具体WebSocket消息的接口,就像Servlet与http请求一样。
有两种方式定义Endpoint:
一、编程式,即继承类javax.websocket.Endpoint并实现(抽象类)器方法。
二、注解式,即定义一个POJO,并添加@ServletEndpoint相关注解。
方法
onClose | @onClose 当会话关闭时调用 | |
onOpen | @onOpen 当开启一个新的会话时调用 | |
onError | @onError 连接过程中异常调用 |
服务器如何接收客户端发送的数据?
通过为Session添加MessageHandler消息处理器来接收消息,当采用注解方式定义Endpoint时,我们还可以通过@OnMessage注解指定接收消息的方法。
服务器端如何推送数据给客户端呢?
发送消息则由 RemoteEndpoint 完成,其实例由 Session 维护,根据使用情况,可以通过Session.getBasicRemote 获取同步消息发送的实例,然后调用其 sendXxx()方法(XXX指的是类型)就可以发送消息,可以通过 Session.getAsyncRemote 获取异步消息发送实例。
服务端代码举例: