一.场景:
web应用定时拉取http数据
1.每次可能重新创建(keep-alive)
2.http带多余的请求头(浏览器)
3.单向请求
二.协议(rfc6455):
ws80 wss443
握手和数据传输
1.握手:通过http/https,兼容http
请求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
2.数据传输:
数据帧(opcode)
text/二进制/连续帧
控制帧
ping pong close
三.实现:
org.java-websocket:Java-WebSocket:1.5.1
WebSocketClient类回调
onOpen()
onMessage(ByteBuffer bytes)
onClose()
onError(ex)
写数据
webSocketClient.send(ByteBuffer bytes)
四.遇到问题
1.本身内部ping和pong机制以及超时都有实现默认超时1m
2.需要支持多端
五.参看文档
https://datatracker.ietf.org/doc/rfc6455/?include_text=1
https://github.com/TooTallNate/Java-WebSocket