首页 > 其他分享 >WebSockets:原理、握手及代码实现

WebSockets:原理、握手及代码实现

时间:2024-08-13 16:37:59浏览次数:12  
标签:代码 WebSocket 握手 console HTTP 连接 WebSockets 客户端

1. WebSockets 原理

WebSockets 是 HTML5 标准的一部分,旨在为 Web 应用提供全双工通信能力。与传统的 HTTP 请求不同,WebSockets 连接一旦建立,就可以在客户端和服务器之间自由传输数据,而不再需要每次通信都重新建立连接。

工作流程:

  1. 建立连接:客户端通过 HTTP 协议发起 WebSocket 握手请求,服务器接收到请求后,如果支持 WebSocket,则会返回一个 101 状态码,表示协议切换成功。
  2. 数据传输:一旦连接建立,客户端和服务器之间可以在不需要额外的请求-响应的情况下自由交换数据,直到连接被显式关闭。
  3. 关闭连接:连接可以由客户端或服务器任何一方发起关闭。

优点:

  • 实时性强:由于是全双工通信,数据可以实时地从客户端和服务器双方发送,不再受限于请求-响应模型。
  • 减少开销:不需要频繁建立和关闭连接,节省了资源和时间。
  • 支持二进制数据:除了文本数据,WebSockets 还可以传输二进制数据,如图片、视频等。

2. WebSocket 握手

WebSocket 握手是建立 WebSocket 连接的第一步,它是通过标准的 HTTP 请求来实现的,但在完成握手后,通信协议会从 HTTP 切换到 WebSocket。

握手请求(由客户端发起):

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
  • GET /chat HTTP/1.1:这是一个标准的 HTTP GET 请求,用于发起 WebSocket 连接。
  • Upgrade: websocket:表明客户端希望将协议升级为 WebSocket。
  • Connection: Upgrade:要求服务器升级连接。
  • Sec-WebSocket-Key:一个随机生成的 base64 编码的值,用于安全校验。
  • Sec-WebSocket-Version:表示 WebSocket 协议版本,这里是 13。

握手响应(由服务器返回):

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

 

  • 101 Switching Protocols:状态码 101 表示服务器同意切换协议。
  • Sec-WebSocket-Accept:基于客户端的 Sec-WebSocket-Key 和一个魔数字符串 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 生成的一个校验值,用于验证握手请求的合法性。

3. WebSocket 的代码实现

下面我们通过一个简单的示例来展示如何使用 WebSocket 在客户端与服务器之间实现实时通信。

客户端(JavaScript 实现):

// 创建 WebSocket 连接
const socket = new WebSocket('ws://localhost:8080');

// 连接打开时触发
socket.onopen = function(event) {
    console.log('WebSocket connection established');
    socket.send('Hello Server!'); // 向服务器发送消息
};

// 接收到消息时触发
socket.onmessage = function(event) {
    console.log('Message from server:', event.data);
};

// 连接关闭时触发
socket.onclose = function(event) {
    console.log('WebSocket connection closed:', event);
};

// 连接发生错误时触发
socket.onerror = function(error) {
    console.error('WebSocket error:', error);
};

 

服务器端(Node.js 实现):

const WebSocket = require('ws');

// 创建 WebSocket 服务器实例,监听 8080 端口
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('Client connected');

    // 接收客户端消息
    ws.on('message', (message) => {
        console.log('Received:', message);
        ws.send('Hello Client!'); // 向客户端发送消息
    });

    // 处理连接关闭
    ws.on('close', () => {
        console.log('Client disconnected');
    });
});

 

运行步骤:

  1. 启动服务器:在 Node.js 环境中运行服务器端代码。
  2. 运行客户端:将客户端代码嵌入到一个 HTML 文件中,并在浏览器中打开该文件。
  3. 在浏览器控制台查看 WebSocket 连接建立的日志,并观察客户端和服务器之间的消息传递。

4. WebSockets 的应用场景

WebSockets 适用于多种实时通信场景:

  • 实时聊天应用:用户之间可以即时发送和接收消息。
  • 实时数据流:如股票行情、加密货币价格等需要实时更新的数据流应用。
  • 多人在线游戏:实现玩家之间的实时互动。
  • 协作工具:如实时协作编辑、多人白板等。

 

标签:代码,WebSocket,握手,console,HTTP,连接,WebSockets,客户端
From: https://www.cnblogs.com/zx618/p/18357253

相关文章

  • 京东旋转验证码识别代码
    京东旋转验证码样例如下:现在京东更新了很多新图片,我们再次进行了大量数据标记,完成了这款验证码的更新。现在正确率可以达到95%左右。下边是这款验证码的识别代码:importbase64importrequestsimportdatetimeimportnumpyasnpfromioimportBytesIOfromPILimpo......
  • 代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳
    代码随想录算法训练营Day42代码随想录算法训练营第42天|LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖股票时机含冷冻期LeetCode714.买卖股票的最佳时机含手续费目录代码随想录算法训练营前言LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖......
  • 代码随想录算法训练营第十三天|二叉树理论基础,144.二叉树的前序遍历,145.二叉树的中序
    day12周日放假二叉树理论基础:文章链接:代码随想录文章摘要:满二叉树定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一......
  • dyMEAN代码分析
    这段代码的作用是生成一个cmask列表,用于指示在模型的预测过程中,哪些残基的坐标需要被生成(预测),哪些残基的坐标是固定的(不需要预测)。以下是对这行代码的详细解读:1.背景信息cmask:这是一个掩码(mask),用于指定哪些坐标需要生成(由模型预测),哪些坐标保持固定(不变)。0表示坐标是固......
  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......
  • 了解VSCode:一款功能强大的开源代码编辑器
    VisualStudioCode(简称VSCode)是由微软开发的一款免费、开源的源代码编辑器。它以其强大的功能、丰富的插件生态系统、跨平台兼容性以及出色的用户体验,成为了广大开发者的首选工具。以下是对VSCode的详细介绍,涵盖其特点、功能、安装与配置、以及扩展生态等方面。一、VSCode的......
  • 404页面html代码
    404页面html代码_百度搜索(baidu.com)<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • PHP 返回结果给前端/ajax后,在后台继续执行代码的方法
    .问题背景在实际项目开发中,遇到一个问题:前端通过Ajax请求后台PHPAPI接口,执行多文件的打包下载操作,该请求由于需要更新大量的数据(日志、统计等信息)到数据库且还需要执行较大的磁盘IO操作,导致该请求很耗时间。由于前端页面的更新需要快速响应,因此需要PHP快速返回计算结果,然......
  • 基于ssm+vue.js+uniapp的基于冲突动态监测算法的健身房预约系统附带文章和源代码部署
    文章目录前言详细视频演示具体实现截图技术栈后端框架SSM前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
    一、TensorFlow简介TensorFlow是由GoogleBrain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(ComputationGraph),这是一种用于表示计算流程的图结构,由节点(代表......