WebSocket:开启实时通信的新篇章
在当今的互联网应用中,实时交互已经成为不可或缺的一部分。无论是实时的在线聊天、股票行情更新,还是多人在线游戏,都需要一种高效的双向通信机制。而这正是 WebSocket 的用武之地。
本文将带你深入了解 WebSocket,探索其工作原理、优势以及如何在实际项目中应用它。
一、WebSocket 简介
WebSocket 是一种建立在单个 TCP 连接上的全双工通信协议,它允许服务器和客户端在建立连接后,可以随时向对方发送数据。与传统的 HTTP 请求-响应模式相比,WebSocket 具有以下优势:
- 真正的双向通信: 客户端和服务器都可以主动发送消息,无需等待对方的请求。
- 低延迟: 建立连接后,数据可以几乎实时地传输,避免了 HTTP 请求的额外开销。
- 减少带宽消耗: WebSocket 使用更轻量级的协议头,并且连接保持持久,减少了不必要的网络开销。
二、WebSocket 的工作原理
WebSocket 连接建立的过程如下:
- 握手阶段: 客户端首先向服务器发送一个 HTTP 请求,请求升级到 WebSocket 协议。
- 协议升级: 如果服务器支持 WebSocket,它会返回一个响应,表示接受协议升级。
- 数据传输: 握手成功后,客户端和服务器就可以通过 WebSocket 协议进行双向数据传输。
WebSocket 的数据传输是基于消息的,消息可以是文本或二进制数据。
三、WebSocket 的应用场景
得益于其高效的双向通信能力,WebSocket 被广泛应用于各种实时交互的场景,例如:
- 即时通讯: WebSocket 是实现实时聊天应用的主流技术,它可以保证消息的即时送达。
- 在线游戏: 多人在线游戏需要实时同步玩家状态,WebSocket 可以满足其低延迟和高性能的需求。
- 股票行情: 股票行情瞬息万变,WebSocket 可以实时推送最新的行情数据,方便用户进行决策。
- 协作工具: WebSocket 可以用于实现实时协作工具,例如在线文档编辑、协同设计等。
四、WebSocket 的实践
以下是一个简单的 WebSocket 示例,展示了如何使用 JavaScript 和 Node.js 实现一个简单的聊天应用:
服务器端 (Node.js with ws library):
// 引入 ws 库,该库提供了 WebSocket 功能的实现
const WebSocket = require('ws');// 创建一个 WebSocket 服务器,监听 8080 端口
const server = new WebSocket.Server({ port: 8080 });// 监听客户端的连接事件
server.on('connection', (socket) => {console.log('Client connected'); // 打印客户端连接成功的信息// 监听客户端发送的消息事件socket.on('message', (message) => {console.log(`Received: ${message}`); // 打印接收到的消息// 广播消息给所有连接的客户端server.clients.forEach((client) => {// 检查客户端是否处于连接状态if (client.readyState === WebSocket.OPEN) {client.send(message); // 发送消息}});});// 监听客户端断开连接事件socket.on('close', () => {console.log('Client disconnected'); // 打印客户端断开连接的信息});
});
解析服务端流程:
- 创建 WebSocket 服务器:
- 使用
ws
库的WebSocket.Server
类创建一个 WebSocket 服务器,并监听端口8080
。
- 使用
- 处理客户端连接:
- 通过
server.on('connection', callback)
监听客户端连接事件,socket
参数表示与客户端的连接对象。
- 通过
- 处理客户端消息:
- 通过
socket.on('message', callback)
监听客户端发送的消息,并通过server.clients.forEach
将消息广播给所有连接的客户端。
- 通过
- 处理客户端断开连接:
- 通过
socket.on('close', callback)
监听客户端断开连接事件,并打印相关信息。
- 通过
客户端 (JavaScript):
// 创建一个 WebSocket 实例,连接到服务器
const socket = new WebSocket('ws://localhost:8080');// 监听连接成功的事件
socket.addEventListener('open', () => {console.log('Connected to server'); // 打印连接成功的信息
});// 监听服务器发送的消息事件
socket.addEventListener('message', (event) => {const message = event.data; // 获取服务器发送的消息console.log(`Received from server: ${message}`); // 打印接收到的消息
});// 发送消息到服务器
function sendMessage(message) {socket.send(message); // 使用 socket.send() 方法发送消息
}// 示例用法:向服务器发送一条消息
sendMessage('Hello, WebSocket!');
解析客户端流程:
- 创建 WebSocket 连接:
- 使用
new WebSocket(url)
创建一个 WebSocket 实例,url
是服务器的 WebSocket 地址。
- 使用
- 监听连接成功事件:
- 通过
socket.addEventListener('open', callback)
监听连接成功事件,callback
会在连接成功时执行。
- 通过
- 监听服务器消息事件:
- 通过
socket.addEventListener('message', callback)
监听服务器发送的消息,event.data
是消息内容。
- 通过
- 发送消息到服务器:
- 使用
socket.send(message)
方法向服务器发送消息。
- 使用
五、WebSocket 的挑战与未来
尽管 WebSocket 拥有诸多优势,但在实际应用中也面临着一些挑战:
- 浏览器兼容性: 虽然大多数现代浏览器都支持 WebSocket,但仍然需要考虑一些旧版本浏览器的兼容性问题。
- 协议复杂性: WebSocket 协议本身比 HTTP 协议更加复杂,开发和调试难度相对较大。
- 安全性和性能: WebSocket 需要考虑到连接的安全性和性能优化,例如身份验证、数据加密、连接管理等。
未来,随着 Web 技术的不断发展,WebSocket 将会在更广泛的领域得到应用,例如实时音视频通信、物联网设备连接等。同时,WebSocket 协议本身也在不断演进,未来将会提供更强大的功能和更安全的保障。
六、总结
WebSocket 作为一种高效的双向通信协议,为实时交互应用提供了强大的技术支持。它已经成为现代 Web 应用中不可或缺的一部分,并将继续在未来发挥重要的作用。
相信通过本文的介绍,你已经对 WebSocket 有了更深入的了解。赶快尝试使用 WebSocket 来构建你的实时应用吧!
相关文档:
相关文章:
WebSocket:开启实时通信的新篇章
在当今的互联网应用中,实时交互已经成为不可或缺的一部分。无论是实时的在线聊天、股票行情更新,还是多人在线游戏,都需要一种高效的双向通信机制。而这正是 WebSocket 的用武之地。 本文将带你深入了解 WebSocket,探索其工作原理…...
只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
当消费电子领域普遍追求“更轻更薄”的设计美学时,遨游三防平板不止于此,还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中,三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足,常因环境…...
C++ 各种map对比
文章目录 特点比较1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map(SGI STL 扩展) C 示例代码代码解释 特点比较 1. std::map 底层实现:基于红黑树(一种自平衡的二叉搜索树)…...
《量子门与AI神经元:计算世界的奇妙碰撞》
在当今科技飞速发展的时代,量子计算和人工智能作为前沿领域,正不断颠覆我们对计算和智能的认知。量子门操作和AI中的神经元计算过程,分别作为这两大领域的核心机制,看似处于不同维度,却有着千丝万缕的联系,…...
【Linux———生产消费模型】
并不是真的路过而已,也不是真的不会想你.............................................................................. 文章目录 前言 一、【生产者消费者模型的介绍】 1、【概念引入】 2、【特点—321原则】 3、【优点】 二、【基于阻塞队列的生产者消费…...
876.链表的中间节点
题目 Python # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:slow fa…...
蓝桥杯第13届真题2
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码&a…...
【微信小程序变通实现DeepSeek支持语音】
微信小程序实现录音转文字,并调用后端服务(Node.js)进行语音识别和,然后调用DeepSeek 处理的完整实现。 整体架构 前端(微信小程序): 实现录音功能。将录音文件上传到后端。接收后端返回的语音…...
XSS 绕过分析:一次循环与两次循环的区别
目录 代码分析 代码流程: 一次循环的问题 原因分析:删除顺序导致遗漏 两次循环修复方案 两种绕过方式 绕过方法 1:DOM破环 绕过方法 2:SVG XSS(双 SVG 绕过) 1. 为什么 "一个SVG注定失败&…...
AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命
摘要 AI正深度重构工程设计、施工与总承包行业,推动从传统经验驱动向数据智能驱动的转型。本文系统性解析AI当前在智能优化设计、施工过程管理、全生命周期数字孪生等场景的应用,展望未来AI在自动化决策、跨域协同等领域的潜力,并从投入产出…...
全局上下文网络GCNet:创新架构提升视觉识别性能
摘要:本文介绍了全局上下文网络(GCNet),通过深入分析非局部网络(NLNet),发现其在重要视觉识别任务中学习的全局上下文与查询位置无关。基于此,提出简化的非局部模块、全局上下文建模…...
MySQL 调优
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
ASP3605抗辐照加固同步降压调节器——商业航天电源芯片解决方案新选择
ASP3605企业宇航级型号ASP3605S2U通过SEU≥75 MeVcm/mg与SEL≥75 MeVcm/mg抗辐射测试。其输入电压4V至15V,输出电流5A,支持多相级联与冗余设计,适用于卫星、航天器电源系统。 面向航天场景的核心功能设计 1. 抗辐射与可靠性保障 单粒子效应…...
C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)
这里写自定义目录标题 ListDIctionary List MyList类:这是一个泛型类,能够存储任意类型的元素。 _items数组:用于实际存储元素。 _size变量:记录当前列表中的元素数量。 构造函数:初始化数组容量为 4。 Count属性&…...
设计模式-对象创建
对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…...
Linux进程虚拟内存空间的管理
5、 进程虚拟内存空间的管理 主要逻辑 重点函数 task_struct函数(进程在内核中的描述符函数) 进程在内核中的描述符task_struct结构: struct task_struct{ //进程的描述符//进程idpid_t pid;//用于标识线程所属的进程pid_t tgi…...
git tag常用操作
git tag是干嘛用的,相当于一个轻量级的分支。在一个分支上,创建一个tag,就是标记某一次的提交。然后方便checkout到 这个标签上。用tag的意思就是不用专门再创建一个新分支来修改后续的改动。分支不变,继续在上面改动,…...
VIVO手机如何实现证件照换底色?证件照换底色技巧分享
在日常生活中,我们常常需要使用不同底色的证件照,无论是办理证件、提交资料还是其他用途,一张符合要求的证件照都显得尤为重要。 而VIVO手机凭借其强大的拍照功能和便捷的图片编辑工具,为我们提供了一种简单高效的证件照换底色解…...
函数闭包的学习
作用:可以保存外部函数的变量 形成条件: 1 函数嵌套 2 内部函数用了外部函数的变量或者参数 3 外部函数返回了内部函数(是返函数名,不带括号) 这个使用了外部函数变量的内部函数称为闭包。 口诀:函数嵌…...
解码软件需求的三个维度:从满足基础到创造惊喜
在软件开发的世界里,用户需求就像一张复杂的地图,指引着产品前进的方向。但并非所有需求都能带来同样的价值——有些是产品生存的“氧气”,有些是吸引用户的“磁石”,还有一些则是让人眼前一亮的“魔法”。如何区分它们࿱…...
网页制作代码html制作一个网页模板
制作一个简单而实用的网页模板:HTML基础入门 在数字时代,网页已成为信息展示和交流的重要平台。HTML(HyperText Markup Language)作为网页制作的基础语言,为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…...
股票量化交易开发 Yfinance
以下是一段基于Python的股票量化分析代码,包含数据获取、技术指标计算、策略回测和可视化功能: python import yfinance as yfimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom backtesting import Bac…...
从 Snowflake 到 Databend Cloud:全球游戏平台借助 Databend 实现实时数据处理
导读:某全球游戏平台为全球数百万玩家提供实时的技能型游戏体验与无缝的实时互动。对该游戏平台而言,保持数据的实时更新和实时分析,对提升玩家互动和留存率至关重要。他们在使用 Snowflake 进行实时数据摄取和分析时遇到了重大挑战ÿ…...
工作记录 2017-02-08
工作记录 2017-02-08 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、CPT的录入页面做修改 1.1、Total 改为 Price 1.2、当删除行时,下面的行自动上移。 2、Pending Payments、Payment Posted、All A/R Accounts页面加了CoIns…...
【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
RabbitMQ基于AMQP协议实现,由多个核心组件组成,确保消息的可靠传递。 Rabbit的架构图: 1.RabbitMQ的基本架构: 1.核心组件: 1.Producer(生产者): 发送消息到RabbitMQ。 2.Exchange(交换机):接…...
Quartz知识点总结
简单说明 简单的定时任务使用Timer或者ScheduledExecutorService quartz支持复杂的定时执行功能。支持ram存储(内存存储)和持久化存储。quartz有分布式和集群能力 简单使用 获取任务调度器Schedule。任务调度器可以管理任务。创建任务实例。使用JobB…...
P2786 英语1(eng1)- 英语作文
P2786 英语1(eng1)- 英语作文 题目背景 蒟蒻 HansBug 在英语考场上,挠了无数次的头,可脑子里还是一片空白。 题目描述 眼下出现在 HansBug 蒟蒻面前的是一篇英语作文,然而智商捉急的 HansBug 已经草草写完了&#…...
Clion远程开发配置
代码开发环境:windows下,基于Clion 2024.3开发,标准为C20 代码运行环境:远程服务器,ubuntu,cmake版本3.12,gcc11.4,g11.4,gdb12.1 实现功能:在本地windows开…...
Javascript基础
目录 1. 变量声明2. 基本数据类型3.复杂数据类型4.字符串方法5.对象方法6.时间方法7.条件(if)8.循环(for/while)9.遍历(for in/of)10.多选(Switch)END 1. 变量声明 const࿱…...
蓝桥杯2023年第十四届省赛真题-阶乘的和
蓝桥杯2023年第十四届省赛真题-阶乘的和 时间限制: 2s 内存限制: 320MB 提交: 3519 解决: 697 题目描述 给定 n 个数 Ai,问能满足 m! 为∑ni1(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 1 2 3 m。 输入格式 输入的第一行包含一个整…...
供应链优化售前方案建议书V23(58页PPT)(文末有下载方式)
随着家电行业的快速发展,供应链管理已成为企业竞争的关键要素。杭州松下电器在面对日益复杂的市场环境和激烈的市场竞争时,急需对其供应链进行优化。本文将对杭州松下电器的供应链优化方案进行详细解读,探讨其优化策略及其潜在价值。 供应链…...
校园论坛系统Selenium自动化测试
本文为自动化测试 本项目自动化测试代码链接(仅供参考): 自动化测试代码 功能测试文章链接: 校园论坛系统自动化测试报告-CSDN博客 🌈自动化测试 思维导图 根据思维导图, 我们选取几个主要的功能进行自动化测试 编写代码 思路: 根据脑图进行测试用例的编写&am…...
Linux 一步部署DHCP服务
#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误:非root用户,权限不足!" exit 0 fi #防火墙与高级权限 systemctl stop firewa…...
Cool Request:可以统计任意方法耗时
什么是Cool Request Cool Request是一个IDEA中的接口调试插件,除了可以发起基本的HTTP请求之外,还提供了强大的反射调用能力,可以绕过拦截器,这点广受网友的好评,当然伴随着还有Spring中对Scheduled注解的调用&#x…...
基于Spring Boot的图书管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Python实战(2)-数据库支持
使用简单的纯文本文件可实现的功能有限。诚然,使用它们可做很多事情,但有时可能还需要额外的功能。你可能希望能够自动完成序列化,此时可求助于shelve和pickle(类似于shelve)。不过你可能需要比这更强大的功能。例如…...
【工具】isolateR桑格测序数据的自动化处理、分类分析以及微生物菌株库的生成R包
文章目录 介绍代码案例Step 1: isoQC - Automated quality trimming of sequencesStep 2: isoTAX - Assign taxonomyStep 3: isoLIB - Generate strain library 参考 介绍 对分类标记基因(如16S/18S/ITS/rpoB/cpn60)进行桑格测序是鉴定包括细菌、古菌和…...
比特币牛市还在不在
在加密货币的风云世界里,比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作,再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中,获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…...
鸿蒙下载文件保存到手机本地公共文件夹下、将本地的沙箱目录文件,保存到公共目录,鸿蒙picker save保存文件为空(0字节)的问题
1、首先将下载好的文件,保存到本地目录,这个目录是用户看不到的; 2、然后通过picker的save保存文件,这个picker,它只是获取公共目录uri用的 3、当picker有回调时,将公共目录的uri获取之后,把下…...
红日靶场(二)——个人笔记
靶场搭建 新增VMnet2网卡 **web:**需要配置两张网卡,分别是外网出访NAT模式和内网域环境仅主机模式下的VMnet2网卡。 **PC:**跟web一样,也是需要配置两张网卡,分别是外网出访NAT模式和内网域环境仅主机模式下的VMn…...
口袋书签功能上新,免费使用
丰富主页面的菜单,操作更加便捷。 快来构建你的门户站点吧。 戳: 口袋书签...
Model Context Protocol - Prompts
1. 概述 Model Context Protocol (MCP) 提供了一种标准化的方式,使服务器能够向客户端暴露提示模板(prompts)。Prompts 是服务器提供的结构化消息和指令,用于与语言模型进行交互。客户端可以发现可用的提示、获取其内容ÿ…...
零知识证明:区块链隐私保护的变革力量
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
基于STC89C52的CD4511译码显示数字设计
摘要 本文深入探讨基于STC89C52单片机的数字显示系统设计,剖析CD4511译码驱动芯片工作原理,结合Proteus仿真验证功能。通过硬件电路、软件编程及原理分析,完整呈现单片机控制数码管显示的实现过程,为相关开发提供理论与实践参考。 一、引言 在单片机应用中,数码管显示是…...
MPC算法路径跟踪_Matlab实现
在机器人控制领域,模型预测控制(MPC)因其能够处理动态约束和多目标优化的特性,成为路径跟踪的热门方案。近期,我在 GitHub 上发现了 Mr.Winter 的MPC路径规划项目,其代码实现简洁且功能完整。本文将结合理论…...
QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建
目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装Visual Studio 2022 1.4 在Visual Studio 2022中安装Qt插件 1.5 在Visual Studio 2022中安装大模型编程助手 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3…...
洛科威多功能岩棉板为环保助力,推动企业绿色可持续发展
在当今全球环保意识日益增强的背景下,企业工程项目在追求高效益的同时,也更加注重绿色可持续发展。作为建筑材料领域的佼佼者,洛科威公司推出的多功能岩棉板凭借其卓越的绿色环保特性,正逐渐成为企业工程项目领域的首选材料。 洛科…...
7.3《重力》
教会什么:重力及其三要素、重力加速度g、 培养什么:从力的三要素出发去研究一个力,用所学探究未知 课标: (二)运动和相互作用 2.2 机械运动和力 2.2.3 通过常见事例或实验,了解重力,认识力的作用效果。 (四)实验探究 4.1.6 用弹测力计测量力。 例6 测量一本物理教科书…...
虚幻基础:ue自定义类
文章目录 Gameplay Tag:ue标签类创建:其他-数据表格-gameplaytag安装:项目设置:gamePlayTag:gamePlay标签列表使用:变量类型:gamePlayTag primary data asset:ue数据类:通…...
88页手册上线 | 企业级本地私有化DeepSeek实战指南
DeepSeek为普通企业在低成本、高性能、安全可控的前提下私有化部署AI大模型提供了可行路径。 云轴科技ZStack全新推出《企业级本地私有化DeepSeek实战手册》(点击免费下载),直击企业痛点,从7B轻量化模型到671B超大规模部署&#…...