JavaWebSocket 编程(⼆):WebSocket 实现主动推送交互
WebSocket 协议
WebSocket 协议通信机制
WebSocket协议是独⽴的、基于TCP的协议。其本质是先通过HTTP/HTTPS协议进⾏握⼿后创建⼀个⽤于交换数据的TCP连接,此后服
务器端与客户器端通过此TCP连接进⾏实时通信。
WebSocket 打开握⼿
每个socket连接都始于⼀个HTTP请求,该请求包含⼀个特殊的⾸标Upgrade。Upgrade⾸标表⽰客户端会将连接升级到不同的协议。在这种情况下,这个不同的协议就是WebSocket。
发送握⼿请求
客户端通过HTTP协议传输WebSocket⽀持的版本号、HTTP协议的版本号、原始地址和主机地址等字段给服务器端。客户端发送的HTTP 请求代码如下:这个升级的请求头增加了以下字段:
GET /chat HTTP 1.1
Host: server .example
Upgrade: WebSocket
Connection: Upgrade
Sec -WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: example
Sec -WebSocket-Protocol: chat, superchat
Sec -WebSocket-Version: 13
Sec-WebSocket-Protocol:客户端可以接收的⼦协议的类型,即在WebSocket协议之上的应⽤层协议类型。
Connection:告知服务器端当前请求连接是升级的HTTP请求。
Origin:防⽌客户端使⽤脚本进⾏未授权的跨源攻击。服务器端根据这个字段判断是否接受客户端的Socket连接。可以返回⼀个HTTP 错误状态码来拒绝连接。
Sec-WebSocket-Key:为了表⽰服务器端同意和客户端进⾏Socket连接,服务器端需要使⽤该字段进⾏校验,然后返回⼀个校验过的字符串给客户端,客户端验证通过后才能正式建⽴Socket连接。
Sec-WebSocket-Version:表⽰版本兼容性。
返回握⼿应答
WebSocket服务器端收到客户端发送的握⼿请求后,如果数据包数据和格式正确,客户端和服务器端
的协议版本号匹配等,就接收本次握⼿链接,并给出响应的数据回复。服务器端返回的响应代码如下:
HTTP/1.0 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: xxxxxxxxxxxxxxxxxxxxxxxx
Sec-WebSocket-Protocol: chat
响应代码中包含以下字段:
Sec-WebSocket-Accept:服务器端将加密处理后的握⼿Key通过这个字段返回给客户端,表⽰同意握⼿建⽴连接。
Sec-WebSocket-Protocol:服务器选择的⼀个应⽤层协议。
客户端收到服务器端回复的数据包后,如果数据包内容、格式都正确,就表⽰本次连接成功,升级为
WebSocket协议,这也称作WebSocket初始握⼿(Opening Handshak)。
数据帧传输格式
WebSocket连接打开时,客户端和服务器端可以互相发送数据,数据使⽤⼀系列帧来传输。基本的数据帧由⼀个opcode、⼀个payload长度和发送的应⽤数据等组成。java源代码加密
0123
01234567890123456789012345678901
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|    (7)    |            (16/64)          |
|N|V|V|V|      |S|            |  (if payload len==126/127)  |
| |1|2|3|      |K|            |                              |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|    Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                              |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)      |          Payload Data        |
+-------------------------------- - - - - - - - - - - - - - - - +
:                    Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                    Payload Data continued ...                |
+---------------------------------------------------------------+
FIN:1bit,表⽰是消息的最后⼀帧。
RSV1,RSV2,RSV3:每个1bit,必须是零,除⾮扩展定义为⾮零,如果接收到的是⾮零值但是扩展没有定义,则需要关闭连接。
Opcode:4bit,解释payload数据,规定有以下不同的状态,如果未知则接收⽅马上关闭连接。状态如下:0x0(附加数据帧)、0x1(⽂本数据帧)、0x2(⼆进制数据帧)、0x3-7(保留为之后⾮控制帧使⽤)、0xB-F(保留位后⾯的控制帧使⽤)、0x8(关闭连接帧)、0x9(ping)、0xA(pong)。
Mask:1bit,掩码,定义payload数据是否进⾏了掩码处理。
Masking-Key: 0到4⼦节,掩码解密密钥,⽤于解码Payload Data。客户端发出的数据帧需要进⾏亚⿇处理,所以此位是1。
Payload length:7bit、7+16bit或7+64bit。payload Data的长度。
Payload data:任意长度数据。包含有扩展定义数据和应⽤数据。
WebSocket关闭握⼿
正常关闭握⼿的步骤:
1. 当⼀端接收到⼀个关闭帧,且先前没有发送关闭帧,则这⼀端必须发送⼀个关闭帧作为响应。
2. 当接收到这个响应帧时,接收这⼀端关闭连接,同时发送表明关闭连接的控制帧,不再发送数据。
3. 另⼀端接收到表⽰应该关闭连接的控制帧后,丢弃后⾯接收的所有数据,关闭连接。
但是TCP关闭握⼿并不总是端到端可靠的,特别是出现拦截代理和其他的中间设施。当WebSocket关闭时,终⽌连接的端点可以发送⼀个数字代码,以及⼀个表⽰选择关闭套接字原因的字符串。代码1000~1015规定⽤于WebSocket连接层。
WebSocket协议通信实现的相关技术
WebSocket构造函数
WebSocket构造函数语法格式如下:
var ws = new WebSocket("ws://127.0.0.1/WebSocket/websocket")
URL地址的字符串需要以“ws”或“wss”(加密通信时使⽤)作为开头。
WebSocket事件
客户端的应⽤程序通过监听WebSocket对象上的事件,来及时处理数据和改变连接的状态。WebSock
et对象可以触发4种事件,包括open事件:WebSocket连接建⽴。
message事件:客户端接收到服务器端的数据。
error事件:通信过程中发⽣错误。
close事件:连接关闭。
WebSocket⽅法
send()⽅法:发送数据到服务器端。
close()⽅法:关闭WebSocket连接。可选参数:code(数字型的状态代码)、reason(⽂本字符串)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。