现代Web开发:WebSocket 实时通信详解

news2024/11/8 18:54:50
💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

现代Web开发:WebSocket 实时通信详解

现代Web开发:WebSocket 实时通信详解

  • 现代Web开发:WebSocket 实时通信详解
    • 引言
    • WebSocket 概述
      • 什么是 WebSocket
      • WebSocket 的特点
    • WebSocket 工作原理
      • 握手过程
        • 客户端请求
        • 服务器响应
      • 数据帧
    • WebSocket API
      • 客户端 API
      • 服务器端实现
    • 实战案例分析
      • 实时聊天应用
        • 项目结构
        • 安装依赖
        • 创建 WebSocket 服务器
        • 创建客户端页面
        • 编写客户端脚本
    • WebSocket 安全性
      • 使用 WSS
      • 防止跨站请求伪造(CSRF)
    • WebSocket 与其他技术的比较
      • 与 AJAX 的比较
      • 与长轮询(Long Polling)的比较
    • 总结
    • 参考资料

引言

在现代Web开发中,实现实时通信是一个常见的需求。无论是在线聊天、实时协作编辑还是实时数据更新,WebSocket 技术都提供了强大的支持。本文将详细介绍 WebSocket 的基本概念、工作原理、实现步骤以及实际应用,帮助读者更好地理解和使用 WebSocket。

WebSocket 概述

什么是 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 的特点

  • 全双工通信:WebSocket 提供了真正的双向通信,客户端和服务器可以同时发送数据。
  • 低延迟:相比 HTTP 请求,WebSocket 的数据传输延迟更低。
  • 轻量级:WebSocket 协议的头部信息非常小,减少了不必要的开销。
  • 持久连接:一旦建立连接,除非客户端或服务器主动断开,否则连接会一直保持。

WebSocket 工作原理

握手过程

WebSocket 的握手过程是通过 HTTP 协议完成的。客户端发送一个特殊的 HTTP 请求,服务器响应一个特殊的 HTTP 状态码,从而完成握手。

客户端请求
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
服务器响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

数据帧

握手完成后,客户端和服务器开始通过 WebSocket 进行数据传输。数据传输的基本单位是帧(frame),每个帧都有自己的格式。

WebSocket API

客户端 API

在浏览器中,可以通过 WebSocket 对象来使用 WebSocket API。

const socket = new WebSocket('ws://example.com/socket');

socket.onopen = function(event) {
  console.log('Connection opened:', event);
};

socket.onmessage = function(event) {
  console.log('Message received:', event.data);
};

socket.onclose = function(event) {
  console.log('Connection closed:', event);
};

socket.onerror = function(error) {
  console.error('Error detected:', error);
};

socket.send('Hello, server!');

服务器端实现

在服务器端,可以使用多种语言和框架来实现 WebSocket 服务器。以下是使用 Node.js 和 ws 库的示例。

  1. 安装 ws
npm install ws
  1. 创建 WebSocket 服务器
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('Received:', message);
  });

  ws.send('Hello, client!');
});

实战案例分析

实时聊天应用

假设我们要构建一个简单的实时聊天应用,包含用户登录、发送消息和接收消息功能。

项目结构
chat-app/
├── client/
│   ├── index.html
│   └── script.js
├── server/
│   └── server.js
└── package.json
安装依赖
npm install ws
创建 WebSocket 服务器

server/server.js 中创建 WebSocket 服务器。

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('Received:', message);
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  ws.send('Welcome to the chat!');
});

console.log('WebSocket server is running on ws://localhost:8080');
创建客户端页面

client/index.html 中创建客户端页面。

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
  <title>Real-time Chat</title>
</head>
<body>
  <div id='chat-container'>
    <ul id='messages'></ul>
    <input type='text' id='message-input' placeholder='Type a message...' />
    <button id='send-button'>Send</button>
  </div>
  <script src='./script.js'></script>
</body>
</html>
编写客户端脚本

client/script.js 中编写客户端脚本。

const socket = new WebSocket('ws://localhost:8080');

const messagesList = document.getElementById('messages');
const messageInput = document.getElementById('message-input');
const sendButton = document.getElementById('send-button');

socket.onopen = function(event) {
  console.log('Connection opened:', event);
};

socket.onmessage = function(event) {
  const messageItem = document.createElement('li');
  messageItem.textContent = event.data;
  messagesList.appendChild(messageItem);
};

socket.onclose = function(event) {
  console.log('Connection closed:', event);
};

socket.onerror = function(error) {
  console.error('Error detected:', error);
};

sendButton.addEventListener('click', function() {
  const message = messageInput.value;
  socket.send(message);
  messageInput.value = '';
});

WebSocket 安全性

使用 WSS

为了保证通信的安全性,可以使用 WSS(WebSocket Secure),即加密的 WebSocket 连接。WSS 使用 TLS/SSL 加密,确保数据传输的安全性。

const socket = new WebSocket('wss://example.com/socket');

防止跨站请求伪造(CSRF)

在 WebSocket 服务器端,可以通过验证 Origin 头来防止 CSRF 攻击。

wss.on('connection', function connection(ws, req) {
  if (req.headers.origin !== 'http://example.com') {
    ws.close();
    return;
  }
  // 正常处理连接
});

WebSocket 与其他技术的比较

与 AJAX 的比较

  • 数据传输方向:AJAX 只支持从客户端到服务器的单向数据传输,而 WebSocket 支持双向数据传输。
  • 延迟:AJAX 的每次请求都需要建立新的连接,延迟较高;WebSocket 一旦建立连接,数据传输延迟较低。
  • 资源消耗:AJAX 每次请求都会消耗一定的资源,而 WebSocket 在连接建立后,资源消耗较低。

与长轮询(Long Polling)的比较

  • 数据传输方向:长轮询也只支持从客户端到服务器的单向数据传输,而 WebSocket 支持双向数据传输。
  • 延迟:长轮询的延迟较高,因为每次请求都需要等待服务器响应;WebSocket 的延迟较低。
  • 资源消耗:长轮询会频繁建立和关闭连接,资源消耗较高;WebSocket 一旦建立连接,资源消耗较低。

总结

通过本文,我们深入了解了 WebSocket 的基本概念、工作原理、实现步骤以及实际应用。WebSocket 提供了一种高效、低延迟的实时通信方式,适用于多种应用场景。希望本文能帮助读者更好地理解和应用 WebSocket,提升Web开发能力。
WebSocket握手过程图

参考资料

  • WebSocket 官方文档
  • WebSocket API 参考
  • WebSocket 教程
    WebSocket数据帧结构图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物理验证Calibre LVS | SMIC Process过LVS时VNW和VPW要如何做处理?

SMIC家工艺的数字后端实现PR chipfinish写出来的带PG netlist如下图所示。我们可以看到标准单元没有VNW和VPW pin的逻辑连接关系。 前几天小编在社区星球上分享了T12nm ananke_core CPU低功耗设计项目的Calibre LVS案例&#xff0c;就是关于标准单元VPP和VBB的连接问题。 目前…

《C++类型转换:四种类型转换的规定》

C类型转换&#xff1a;四种类型转换的规定 1. 内置类型中的类型转换2. 内置类型和自定义类型的转换3. 自定义类型转换成内置类型4. 自定义类型之间的转换5. C强制类型转换5.1 static_cast5.2 reinterpret_cast5.3 const_cast5.4 dynamic_cast 6. RTTI&#xff08;了解&#xff…

安全工程师入侵加密货币交易所获罪

一名高级安全工程师被判犯有对去中心化加密货币交易所的多次攻击罪&#xff0c;在此过程中窃取了超过 1200 万美元的加密货币。 沙克布艾哈迈德&#xff08;Shakeeb Ahmed&#xff09;被判刑&#xff0c;美国检察官达米安威廉姆斯&#xff08;Damian Williams&#xff09;称其…

鸿蒙生态崛起:开发者的机遇与挑战

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 实战项目访问&#xff1a;http://javapub.net.cn/ 引言 作为一名技术博主&#xff0c;我对技术趋势始终保持着敏锐的洞察力。在数字化时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。随…

夜天之书 #103 开源嘉年华纪实

上周在北京参与了开源社主办的 2024 中国开源年会。其实相比于有点明显班味的“年会”&#xff0c;我的参会体验更像是经历了一场中国开源的年度嘉年华。这也是在会场和其他参会朋友交流时共同的体验&#xff1a;在开源社的 COSCon 活动上&#xff0c;能够最大限度地一次性见到…

【Linux】信号三部曲——产生、保存、处理

信号 1. 信号的概念2. 进程如何看待信号3. 信号的产生3.1. kill命令3.2. 终端按键3.2.1. 核心转储core dump3.2.2. OS如何知道键盘在输入数据 3.3. 系统调用3.3.1. kill3.3.2. raise3.3.3. abort 3.4. 软件条件3.4.1. SIGPIPE信号3.4.2. SIGALRM信号 3.5. 硬件异常3.5.1. 除零异…

昔日IT圈的热点话题“虚拟化和容器技术路线之争”,现在怎么样了?

“以收单系统为例&#xff0c;虚拟化纯容器在轻量级云平台上融合&#xff0c;实现了对稳态和敏态业务支撑&#xff0c;核心数据库依托于稳定可靠的虚拟机环境&#xff0c;应用趋于敏态创新型应用类业务则采用容器技术部署&#xff0c;实现动态扩展&#xff0c;弹性伸缩&#xf…

智能网联汽车:人工智能与汽车行业的深度融合

内容概要 在这个快速发展的时代&#xff0c;智能网联汽车已经不再是科幻电影的专利&#xff0c;它正在悄然走进我们的日常生活。如今&#xff0c;人工智能&#xff08;AI&#xff09;技术与汽车行业的结合犹如一场科技盛宴&#xff0c;让我们看到了未来出行的新方向。通过自动…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

ZABBIX API获取监控服务器OS层信息

Zabbix 是一款强大的开源监控解决方案,能够通过其 API 接口自动化管理和获取监控数据。在这篇文章中,详细讲解如何通过 Zabbix API 批量获取服务器的系统名称、IP 地址及操作系统版本信息,并将数据保存到 CSV 文件中。本文适合对 Python 编程和 Zabbix 监控系统有一定基础的…

【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!

数据集列表 帮忙采集开源数据集&#xff0c;包括YOLO格式数据集和Pascal VOC格式数据集&#xff0c;含图像原文件和标注文件&#xff0c;几百张到几千张不等&#xff0c;国内外公开数据集均可。 针对目标检测&#xff0c;YOLO系列模型训练&#xff0c;分类训练等。 部分数据…

万字长文详解:SpringBoot-Mybatis源码剖析

目录 背景 传统的Mybaits开发方式&#xff0c;是通过mybatis-config.xml对框架进行全局配置&#xff0c;比如&#xff1a;一级缓存、主键生成器等。 而在SpringBoot发布后&#xff0c;通过引入 mybatis-spring-boot-starter依赖包&#xff0c;可以大大减少工作量&#xff0c;实…

[IAA系列] Image Aesthetic Assessment

Preface 本文旨在记录个人结合AI工具对IAA这个领域的一些了解&#xff0c;主要是通过论文阅读的方式加深对领域的了解。有什么问题&#xff0c;欢迎在评论区提出并讨论。 什么是IAA Image Aesthetic Assessment&#xff08;图像美学评估&#xff09;是一种评估图像在视觉上的…

leetcode 2043.简易银行系统

1.题目要求: 示例: 输入&#xff1a; ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出&#xff…

一文了解Android SELinux

在Android系统中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个增强的安全机制&#xff0c;用于对系统进行强制访问控制&#xff08;Mandatory Access Control&#xff0c;MAC&#xff09;。它限制了应用程序和进程的访问权限&#xff0c;提供了更…

Java链表及源码解析

文章目录 创建一个ILindkedList接口创建方法(模拟实现链表方法)创建MyLinkedList来实现接口的方法创建链表节点addFirst方法&#xff08;新增头部属性&#xff09;addLast方法&#xff08;新增到末尾一个属性&#xff09;remove方法&#xff08;删除指定属性&#xff09;addInd…

微服务系列四:热更新措施与配置共享

目录 前言 一、基于Nacos的管理中心整体方案 二、配置共享动态维护 2.1 分析哪些配置可拆&#xff0c;需要动态提供哪些参数 2.2 在nacos 分别创建共享配置 创建jdbc相关配置文件 创建日志相关配置文件 创建接口文档配置文件 2.3 拉取本地合并配置文件 2.3.1 拉取出现…

NoETL自动化指标平台为数据分析提质增效,驱动业务决策

直觉判断往往来源于多年的经验和专业知识&#xff0c;能够在复杂和不确定的环境中快速做出决策反应。但这种方式普遍存在主观偏见&#xff0c;缺乏合理的科学依据&#xff0c;无法全面、客观、精准地评估和识别市场趋势与用户需求&#xff0c;从而造成决策失误&#xff0c;给业…

使用亚马逊 S3 连接器为 PyTorch 和 MinIO 创建地图式数据集

在深入研究 Amazon 的 PyTorch S3 连接器之前&#xff0c;有必要介绍一下它要解决的问题。许多 AI 模型需要使用无法放入内存的数据进行训练。此外&#xff0c;许多为计算机视觉和生成式 AI 构建的真正有趣的模型使用的数据甚至无法容纳在单个服务器附带的磁盘驱动器上。解决存…

基于MATLAB的实现垃圾分类Matlab源码

⼀、垃圾分类 如何通过垃圾分类管理&#xff0c;最⼤限度地实现垃圾资源利⽤&#xff0c;减少垃圾处置量&#xff0c;改善⽣存环境质量&#xff0c;是当前世界各国共同关注的迫切问题之⼀。根据国家制定的统⼀标准&#xff0c;现在⽣活垃圾被⼴泛分为四类&#xff0c;分别是可…