序言
你可能听说过"WebSokcet"这个词,感觉它好像很高深,但其实它是一个超级酷的小工具,让我们在Web应用里实现实时通信。想象一下,你可以像聊天一样,在浏览器和服务器之间来回“畅聊“,没有延迟,没有刷新,没有重新请求的等待时间。今天,我们就来一探WebSocket的奥秘,看看它是怎么让互联网更有“生命力“的!
1. 什么是WebSocket
WebSokcet是HTML5引入的一种网络协议,最初由IEFT(互联网工程任务组)在2011年发布,专为双向通信设计。简单来说,它让浏览器和服务器之间可以像打电话一样,保持着一个实时的“通话线路”,随时互相传递信息。
在普通的HTTP请求里,浏览器每次想要一些数据,都需要单独“打电话”给服务器,并等待回应,收到后电话就挂断了——这种方式叫短连接。而WebSocket却能让浏览器和服务器之间维持一条长连接,使他们随时可以向对方传递消息,就像微信、微博的实时消息推送那样!更妙的是,WebSokcet建立连接后,通信速度更快且更节省资源。
2. WebSocket的几个关键特性
- 双向通信: WebSocket可以让客户端(浏览器)和服务器彼此都可以主动发消息,而不是等待请求。
- 长连接: 连接一旦建立,不需要每次通信都重新发起连接请求
- 低延迟: 在频繁通信的场景中,比HTTP短连接更省时省力。
- 轻量级: WebSocket协议投很轻巧,减少了数据传输的开销。
3. WebSocket的实际应用场景
WebSocket广泛应用在那些需要实时数据更新的应用里:
- 在线聊天: 比如微信、QQ等即时通讯应用,它们需要实现消息的实时传输,才能让你和朋友“即时聊天”
- 实时推送:各类推送通知,比如微博、新闻网站的实时热点推送、双向的通信能力
- 在线游戏: 多人在线游戏里的实时对战、积分更新都需要低延迟、双向的通信能力。
- 股票/加密货币行情: 金融市场瞬息万变,很多股票、比特币行情数据都依赖WebSocket,确保用户看到的是“秒级”的更新。
- 实时协作工具: 文档、表格等协作工具,需要实时共享数据,大家编辑时能立刻看到彼此的改动。
4. 如何使用WebSocket? 一个简单的示例
WebSocket的使用很简单,浏览器端只需要几行代码,就能和服务建立通信。以下是一个使用JavaScript和WebSocket的基本示例。
//1. 创建WebSocket 连接
const socket = new WebSocket("wss://example.com/socket")
//2.连接成功后触发
socket.onopen = function(event){
console.log('Connected to WebSocket');
socket.send('Hello,Server!');// 向服务器发送信息
}
//3.监听信息
socket.onmessage = function(event){
console.log('Message from server:',event.data)
}
//4.监听关闭事件
socket.onclose = function(event){
console.log('WebSocket connection closed:',event)
}
//5.错误处理
socket.onerror = function(error){
console.error('WebSocket error:',error)
}
在这个例子中,我们首先创建了一个WebSocket连接,并设置了几个监听器:
● onopen: 连接时触发
● onmessage: 当服务器发送消息时触发
● onclose: 当连接关闭时触发。
● onerror: 如果出现错误时触发
5. 浏览器观察数据交互
以bilibili的弹幕为例,打开控制台,或者F12然后查看网络(NetWork),选择过滤WS协议的请求,我们随机选择一个请求,进行查看。其中101 代表的是成功的消息。
我们查看下Message消息,我们可以看到数据在浏览器和服务端之间进行交互:
我们可以看到他们数据传递格式采用的是二进制,我们也可以使用JSON格式进行传递,这样数据的可读性就更高。
其中图中绿色箭头向上的数据是客户端发送给服务端的数据,橙色箭头向下的数据是服务端推送给客户端的数据。
6. WebSocket的工作流程
- 建立连接: 客户端向服务器发送WebSocket连接请求,这类似于一次普通的HTTP请求
- 握手成功: 一旦握手成功,客户端和服务器之间便建立了WebSocket长连接。
- 数据通信: 连接保持着,客户端和服务器可随时互发信息,不需要重新请求。
- 关闭连接: 通信完成户,任何一方都可以主动关闭连接。
7. WebSocket 和 HTTP的区别
WebSocket 并非替代HTTP,而是一种补充。HTTP是无状态、单向的协议,适用于一般网页的请求-响应模式。
而WebSocket则是有状态的,适用于需要频繁双向通信的场景。WebSocket通过建立长连接,可以极大减少宽带开销和延迟,但一般只用于少数需要实时互动的应用。