Websocket开发⽂档
介绍
WebSocket是HTML5开始提供的⼀种在单个 TCP 连接上进⾏全双⼯通讯的协议。在WebSocket API中,浏览器和服务器只需要完成⼀次握⼿,两者之间就直接可以创建持久性的连接,并进⾏双向数据传输。WebSocket使⽤和 HTTP 相同的 TCP 端⼝,可以绕过⼤多数防⽕墙的限制。默认情况下,WebSocket协议使⽤80端⼝;运⾏在TLS之上时,默认使⽤443端⼝。
WebSocket协议建⽴连接的时候需要握⼿,握⼿过程中需要借助HTTP协议来完成,当连接建⽴后,就可以使⽤WebSocket协议进⾏通信,通信结束后,通信双⽅都可以关闭连接。
前端:
1、新建服务器的连接:var webSocket = new WebSocket(url);
2、初始化回调函数
ex:ssage = function (event){
var data = event.data;
console.log(“收到的消息”+data);
}
事件类型WebSocket客户端回调函数事件描述
pen当打开连接后触发
ssage当客户端接收服务端数据时触发
r当通信异常时触发
lose当连接关闭时触发
3、发送消息给服务器
webSocket.send(message);
后端:
使⽤说明:引⼊spring-boot-starter-websocket的jar包
1. 开启WebSocket服务端的⾃动注册
注意:ServerEndpointExporter 是由Spring官⽅提供的标准实现,⽤于扫描ServerEndpointConfig配置类和@ServerEndpoint注解实例。使⽤规则也很简单:1.如果使⽤默认的嵌⼊式容器 ⽐如Tomcat 则必须⼿⼯在上下⽂提供ServerEndpointExporter。2. 如果使⽤外部容器部署war包,则不要提供提供ServerEndpointExporter,因为此时SpringBoot默认将扫描服务端的⾏为交给外部容器处理
@Configuration
public class WebSocketConfig{
@Bean
前端websocket怎么用public ServerEndpointExporter serverEndpointExporter (){
return new ServerEndpointExporter ();
}
2. 创建WebSocket服务端
①通过注解@ServerEndpoint来声明实例化WebSocket服务端。(注意配置@Component才能被spring扫描)
② 通过注解@OnOpen、@OnMessage、@OnClose、@OnError 来声明回调函数。
事件类型WebSocket服务端注解事件描述
open@OnOpen (Session session)当打开连接后触发
message@OnMessage(Session session,String message)当客户端接收服务端数据时触发
error
@OnClose(Session session)当通信异常时触发close @OnError(Session session,Throwable error)当连接关闭时触发
事件类型WebSocket服务端注解事件描述③发送消息:new Session().getBasicRemote().sendText(message);
延伸拓展:
WebSocket协议通过HTTP协议进⾏握⼿是为了兼容基于HTTP的服务器端软件和中间设施,使同⼀个端⼝能够接受HTTP客户端和
WebSocket客户端,为了这个⽬的,WebSocket客户端的握⼿是HTTP请求的升级。客户端和服务端需要通过⼀次HTTP请求与响应来进⾏协议升级,具体步骤如下:
1.客户端向服务端发送协议升级请求
客户端发送的HTTP报⽂⽰例如下:可以看到,其必须是⼀个GET请求,且HTTP版本必须为1.1。除此之外,其还有如下要求:必须带有Host请求头,其值为要请求的主机名。
必须带有Upgrade请求头,且其值必须为websocket,表⽰这个HTTP请求的⽬的是要申请升级到websocket协议,⽽不是其他协议。必须带有Connection请求头,其值必须为Upgrade,表⽰这个HTTP请求是⼀个协议升级请求。
必须带有Sec-WebSocket-Key请求头,且其值为以BASE-64编码的随机字符串。服务器端会⽤这些数据来构造出⼀个SHA-1的信息摘要。把“Sec-WebSocket-Key”的值加上⼀个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进⾏BASE-64编码,将结果做为“Sec-WebSocket-Accept”响应头的值,返回给客户端。如此操作,可以尽量避免普通HTTP报⽂被误认为WebSocket协议握⼿报⽂。如果这个请求是从浏览器发出的,那么还必须带有Origin请求头。
必须带有Sec-WebSocket-Version请求头,且其值必须为13,表⽰使⽤的WebSocket版本为13。
2.服务端响应客户端的协议升级请求
当服务端接收到客户端的协议升级请求时,服务端会判断是否要接受该请求,并返回相应的HTTP响应报⽂给客户端。如果客户端发送的HTTP请求满⾜上述所有要求,那么服务端将会接受该协议升级请求,并返回如下响应报⽂:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
需要注意的是,该响应报⽂的状态码并不是常见的200状态码,⽽是101,那么101状态码表⽰什么意思呢?其表⽰的是服务端同意客户端的切换协议请求,从该报⽂的状态码描述Switching Protocols可得知。具体来说,就是同意将当前的HTTP协议切换到WebSocket协议。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论