learning center banner

WebSocket是什么?

Websocket是什么,WebSocket相比于HTTP的优势,以及案例演示。

WebSocket是一种实时通信协议,能够在客户端和服务器之间实现双向通信,适用于需要低延迟和高频率数据更新的应用程序。

WebSocket是如何工作的?

WebSocket是一种通过单个TCP连接进行全双工通信的协议。它在客户端和服务器之间建立持久连接,允许双向实时通信。WebSocket使用HTTP协议发起握手,然后升级到WebSocket连接,使双方可以直接发送数据。这种持久连接减少了通信开销,使服务器能够主动推送数据到客户端,消除了客户端频繁发起请求的需求。

WebSocket与HTTP的比较

  1. 减少开销:与传统的HTTP连接相比,WebSocket所需的开销较少,因为它消除了每次通信都反复建立和拆除连接的需要,从而降低了延迟并节省网络资源。
  2. 双向通信:WebSocket允许客户端和服务器之间同时进行双向通信,这对于实时应用特别有用,能够更快地传输数据和响应时间。
  3. 高效数据交换:WebSocket支持二进制数据传输,允许更高效和紧凑的数据交换,这对多媒体流、游戏以及其他需要高速数据传输的应用非常有利。
  4. 更低延迟:通过保持持久连接,WebSocket减少了每次数据交换时建立新连接的延迟,从而实现更快和更灵敏的通信。
  5. 服务器推送功能:WebSocket使服务器能够主动向客户端推送数据,而无需客户端不断轮询服务器以获取更新,从而更有效地利用网络资源,减少不必要的数据传输。

总体而言,WebSocket高效利用网络资源、降低延迟,并支持实时双向通信,使其成为各种基于网络的应用程序中优化网络的重要工具。

为什么使用WebSocket?

WebSocket用于需要低延迟、高频率数据更新的实时应用和服务。它特别适用于实时聊天、在线游戏、直播体育更新、金融交易平台、协作编辑工具等应用。与传统HTTP相比,WebSocket能够实现更快、更高效的双向通信,因此特别适合这些类型的用例。

WebSocket服务器(Node.js + ws)

const WebSocket = require('ws');
  
const wsk = new WebSocket.Server({ port: 8080 });
  
wsk.on('connection', ws => {
  ws.on('message', message => {
    console.log('收到来自客户端的消息:%s', message);
      
    // 回复客户端消息  
    ws.send(`我是服务器,我收到的消息是:${message}`);  
  });  
  
  ws.on('close', () => {  
    console.log('客户端已断开连接');  
  });  

客户端(JavaScript)

// 创建WebSocket连接  
var socket = new WebSocket("ws://localhost:8080");  
  
// 连接打开时的操作  
socket.onopen = function(event) {  
  console.log("连接已打开");  
  // 发送初始化消息
  socket.send("我是客户端,已连接!");  
};  
  
// 接收服务器数据时的操作  
socket.onmessage = function(event) {  
  console.log("从服务器接收到的数据是:" + event.data);  
};  
  
// 连接关闭时的操作 
socket.onclose = function(event) {  
  console.log("连接已关闭");  
};  
  
// 处理连接错误  
socket.onerror = function(error) {  
  console.log("发生错误:" + error);  
}

除了在JavaScript中用于前端开发外,我们还可以在Java、C++、Go、Python、PHP和Rust等编程语言平台中使用WebSocket。

一个WebSocket请求案例

以下是典型的WebSocket握手请求示例:

GET /chat HTTP/1.1         // 向/chat端点发出的GET请求。
Host: example.com:8000     // WebSocket服务器的域名和端口。
Upgrade: websocket         // 客户端希望升级到的协议。
Connection: Upgrade        // 告诉服务器客户端希望建立新连接而不是使用现有连接。
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==       // 一段base64编码的随机值,服务器解码后进行哈希处理,然后发送回去以证明服务器收到了请求。
Origin: http://example.com                        // 客户端请求的来源。
Sec-WebSocket-Protocol: chat, superchat           // 如果应用程序使用的子协议,则指定子协议。
Sec-WebSocket-Version: 13                         // 客户端希望使用的WebSocket协议版本。

作为对握手请求的响应,服务器将返回以下内容:

HTTP/1.1 101 Switching Protocols    // 表示正在切换协议,如请求的那样。
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=     // 是对初始握手中发送的Sec-WebSocket-Key的哈希,与特定GUID组合。客户端可以用这个来验证服务器是否收到了握手。

结论

EdgeOne支持WebSocket协议,允许服务器主动向客户端发送数据。WebSocket提供了一个通过单个TCP连接的双向通信通道,允许实时数据交换。这对于需要实时交互的应用程序尤其有益,例如互动游戏、实时聊天、协作文档等。