什么是WebSocket?
HTML5新增协议,它的目的在浏览器和服务器之间建立一个不受限的双向实时通信的通道。比如,服务器可以任意时刻发送消息给浏览器。它是基于TCP,先通过HTTP/HTTPS协议发起一条特殊的HTTP请求进行握手后创建一个用于交换数据的TCP连接。
它的优势是什么?
- 浏览器和服务器只要一次握手动作。
- 双方可以在任意时刻,相互推送消息。
- 服务器和浏览器之间交换的头信息很小。
WebSocket与传统HTTP协议区别是什么?
- HTTP协议,浏览器不主动请求,服务器没法发送数据给浏览器。
- HTTP协议每次链接都必须是三次握手才能发送消息,WebSocket只要一次就能发送消息。
- HTTP协议每次请求都要发送head,WebSocket一旦建立链接,之后请求就不要发送head。
HTTP可用轮询或comet机制实现WebSocket功能,但是有缺点。
轮询:js启动定时器,以固定时间间隔给服务器发送请求,询问服务器有没有新消息。
- 实时性不够
- 频繁请求給服务器造成很大压力
comet:请求没有超过预定时间或者没有返回数据,一直保持链接状态。等有数据,再推送。
- 线程挂起,浪费服务器资源
- 长时间没有数据,链路上任何一个网关都可能关闭这个链接。这要求comet连接必须定期发ping,检查连接是否正常。
如何使用WebSocket?
WebSocket链接必须由浏览器发起,虽然基于HTTP协议发展,但是和HTTP协议不一样。请求以ws://开头的地址,请求头申明这是WebSocket链接。服务器返回,表示成功建立WebSocket。前端可以看菜鸟,后台springboot有spring-boot-starter-websocket。