WebSocket是一种实时通信协议,能够在客户端和服务器之间实现双向通信,适用于需要低延迟和高频率数据更新的应用程序。
WebSocket是一种通过单个TCP连接进行全双工通信的协议。它在客户端和服务器之间建立持久连接,允许双向实时通信。WebSocket使用HTTP协议发起握手,然后升级到WebSocket连接,使双方可以直接发送数据。这种持久连接减少了通信开销,使服务器能够主动推送数据到客户端,消除了客户端频繁发起请求的需求。
总体而言,WebSocket高效利用网络资源、降低延迟,并支持实时双向通信,使其成为各种基于网络的应用程序中优化网络的重要工具。
WebSocket用于需要低延迟、高频率数据更新的实时应用和服务。它特别适用于实时聊天、在线游戏、直播体育更新、金融交易平台、协作编辑工具等应用。与传统HTTP相比,WebSocket能够实现更快、更高效的双向通信,因此特别适合这些类型的用例。
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('客户端已断开连接');
});
// 创建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握手请求示例:
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连接的双向通信通道,允许实时数据交换。这对于需要实时交互的应用程序尤其有益,例如互动游戏、实时聊天、协作文档等。