WebSocket 全面解析

在这里插入图片描述


🌟 引言

WebSocket,一个让实时通信变得轻而易举的神器,它打破了传统HTTP协议的限制,实现了浏览器与服务器间的全双工通信。想象一下,即时消息、在线游戏、实时股票报价…这一切都离不开WebSocket的魔力💫。下面,我们就来深入探索WebSocket的奥秘,并动手实践一段代码吧!💻


📚 WebSocket基础概念

📌 什么是WebSocket?

WebSocket是一种在单个TCP连接上提供全双工通信能力的协议。简单来说,它允许客户端和服务器互相推送数据,无需重复建立连接,大大提升了交互效率和实时性🚀。

📌 为什么需要WebSocket?

WebSocket之前,我们常用轮询或长轮询来模拟实时通信,但这两种方式都存在资源消耗大、延迟高的问题🚫。WebSocket的出现,让服务器能够主动推送信息给客户端,从而实现了真正意义上的实时互动🎉。

📌 与HTTP的关系

WebSocket握手基于HTTP协议,但随后的通信则独立于HTTP,形成了持久的双向通道。这意味着,尽管它们共享相同的起始握手过程,WebSocket的数据传输不依赖于HTTP请求响应模型🌐。


💻 WebSocket API 使用指南

🛠️ 创建WebSocket实例

const socket = new WebSocket('ws://yourserver.com:port/path');

这里ws://WebSocketURL scheme,确保你的服务器支持WebSocket并指定了正确的地址和端口。

🎯 事件监听

WebSocket的核心在于事件处理,以下是一些关键事件:

  • open: 连接建立时触发
  • message: 收到服务器消息时触发
  • error: 发生错误时触发
  • close: 连接关闭时触发

示例代码:

socket.addEventListener('open', (event) => {console.log('Connected to WebSocket server!', event);
});socket.addEventListener('message', (event) => {console.log('Received:', event.data);
});socket.addEventListener('error', (err) => {console.error('WebSocket error observed:', err);
});socket.addEventListener('close', (event) => {console.log('WebSocket connection closed', event);
});

📨 发送消息

向服务器发送文本或二进制数据非常直接:

socket.send('Hello, WebSocket Server!');
// 或发送二进制数据
const binaryData = new Uint8Array([...]); // 二进制数据数组
socket.send(binaryData);

🔍 深入WebSocket原理

WebSocket通信流程包括:

  1. 握手:客户端通过HTTP Upgrade请求初始化连接。
  2. 帧协议:一旦连接建立,数据以帧的形式传输,每个帧包含数据负载和控制信息。
  3. 心跳维护:为了保持连接活跃,双方可能会定期发送心跳包。

🚀 实战演练

想象一个简单的聊天应用,前端使用WebSocket与后端实时通信,用户发送的消息能即时显示在页面上。

📌 前端示例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket 实时通信示例</title><style>/* 样式定义:无序列表去除默认样式,设置消息区域的内边距,按钮样式 */#messages { list-style-type: none; padding: 0; }#messages li { padding: 5px 10px; } /* 每条消息的样式 */button { margin: 5px; } /* 按钮样式 */</style>
</head>
<body>
<h1>WebSocket 实时消息</h1>
<div><!-- 输入框及按钮布局,用于输入消息、发送、连接及断开连接 --><label for="messageInput">消息:</label><input type="text" id="messageInput" placeholder="请输入消息..."><button id="sendBtn" onclick="sendMessage()" disabled>发送</button> <!-- 发送按钮,默认禁用 --><button id="connectBtn" onclick="connect()">连接</button> <!-- 连接WebSocket服务器按钮 --><button id="disconnectBtn" onclick="disconnect()" disabled>断开连接</button> <!-- 断开连接按钮,默认禁用 -->
</div>
<ul id="messages"></ul> <!-- 消息展示区域 -->
<script>let socket; // 声明一个全局变量用来保存WebSocket实例// 连接WebSocket服务器函数function connect() {socket = new WebSocket('ws://localhost:8080'); // 创建WebSocket连接// 监听WebSocket的open事件,表示连接成功建立socket.addEventListener('open', (event) => {console.log('连接已建立');// 修改页面上按钮的可用状态document.getElementById('connectBtn').disabled = true;document.getElementById('disconnectBtn').disabled = false;document.getElementById('sendBtn').disabled = false;});// 监听message事件,处理服务器发来的消息socket.addEventListener('message', (event) => {const messageData = JSON.parse(event.data); // 解析JSON格式的消息数据const messageElement = document.createElement('li'); // 创建一个新的LI元素来显示消息messageElement.textContent = messageData.content; // 设置消息内容document.getElementById('messages').appendChild(messageElement); // 将消息添加到页面中});// 监听close事件,表示连接已关闭socket.addEventListener('close', (event) => {console.log('连接已关闭');// 调整按钮状态document.getElementById('connectBtn').disabled = false;document.getElementById('disconnectBtn').disabled = true;document.getElementById('sendBtn').disabled = true;});}// 发送消息函数function sendMessage() {const input = document.getElementById('messageInput'); // 获取消息输入框const message = input.value; // 获取输入的消息内容if (message.trim()) { // 如果消息不为空const data = {type: 'text', // 消息类型为文本content: message, // 消息内容timestamp: new Date().getTime() // 添加时间戳};socket.send(JSON.stringify(data)); // 将消息转换为JSON字符串并发送input.value = ''; // 清空输入框}}// 断开WebSocket连接函数function disconnect() {if (socket && socket.readyState === WebSocket.OPEN) { // 确保WebSocket连接是打开状态才执行关闭操作socket.close();}}// 初始化页面时禁用发送和断开连接按钮document.getElementById('sendBtn').disabled = true;document.getElementById('disconnectBtn').disabled = true;
</script>
</body>
</html>

📌 后端示例代码:

const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', (ws) => {console.log('客户端已连接');ws.on('message', (message) => {try {const data = JSON.parse(message); // 解析接收到的JSON数据if (data.type === 'text') {ws.send(JSON.stringify(data)); // 发送回处理后的JSON数据}} catch (error) {console.error('处理消息时出错:', error);}});ws.on('close', () => {console.log('客户端已断开连接');});ws.on('error', (err) => {console.error('WebSocket错误:', err);});
});console.log('WebSocket服务器正在监听8080端口...');

🎯总结

📌 核心概念巩固

  • WebSocket定义WebSocket协议是一种在单个TCP连接上提供全双工通信的协议,它允许数据在客户端和服务器之间自由流动,无需反复建立HTTP连接,极大地提升了实时性和效率。
  • 与HTTP关系:虽然WebSocket握手阶段借助HTTP协议,但后续数据传输完全独立,实现了真正的实时推送技术。
  • 应用场景:广泛应用于即时通讯、在线游戏、金融实时报价、协同编辑等对实时性要求极高的场景。

📌 关键技术点回顾

  • 创建连接:通过WebSocket(url)构造函数,指定服务端地址,建立连接。
  • 事件处理:包括openmessageerrorclose四大事件,构成了WebSocket通信的基石。
  • 数据收发:使用send(data)方法发送消息,无论是文本还是二进制数据,都能轻松处理。
  • 协议细节:了解帧格式、握手过程及心跳维护机制,对于优化和调试WebSocket应用至关重要。

📌 实战经验积累

  • 案例实践:简易聊天室的实现,不仅加深了对WebSocket API使用的理解,也展示了其实时交互的强大魅力。
  • 问题解决:识别并解决实际开发中可能遇到的问题,如跨域、错误处理、性能优化等,是提升应用质量的关键。

WebSocket的学习不仅是技术层面的探索,更是对现代Web应用可能性的一次深入挖掘。掌握它,意味着你拥有了构建更加丰富、动态和互动用户体验的能力。继续前行,在实时通信的世界里,还有更多的精彩等待着你去发现和创造!🌟

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python量化炒股的获取数据函数—get_concept()

查询股票所属的概念板块函数get_concept()&#xff0c;利用该函数可以查询一只或多只股票所属的概念板块&#xff0c;其语法格式如下&#xff1a; get_concept(security, dateNone)security&#xff1a;标的代码。类型为字符串&#xff0c;形式如‘000001.XSHE’&#xff0c;或…

宽字符的来历:从ASCII到Unicode,C语言中的宽字符处理

目录 一、ASCII编码&#xff1a;字符世界的开篇 二、Unicode与宽字符的诞生 宽字符类型与宽字符串 三、C语言中的宽字符处理函数 四、宽字符与多字节字符 结语 在计算机科学的发展历程中&#xff0c;字符编码经历了从简单到复杂、从单一语言到全球多语种支持的演变过程。…

【论文阅读】IPT:Pre-TrainedImageProcessingTransformer

Pre-TrainedImageProcessingTransformer 论文地址摘要1. 简介2.相关作品2.1。图像处理2.2。 Transformer 3. 图像处理3.1. IPT 架构3.2 在 ImageNet 上进行预训练 4. 实验4.1. 超分辨率4.2. Denoising 5. 结论与讨论 论文地址 1、论文地址 2、源码 摘要 随着现代硬件的计算能…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了&#xff1a;好多学到的算法都没有用上&#xff0c;几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了&#xff0c;但是。。匆匆忙忙之间就是没有调试出来。&#xff08;还是交了一道暴力[旋风狗头]直接哭死~~&…

iOS - 多线程-atomic

文章目录 iOS - 多线程-atomic1. 源码分析1.1 get方法1.2 set方法 2. 一般不使用atomic的原因 iOS - 多线程-atomic atomic用于保证属性setter、getter的原子性操作&#xff0c;相当于在getter和setter内部加了线程同步的锁可以参考源码objc4的objc-accessors.mm它并不能保证使…

Whisper、Voice Engine推出后,训练语音大模型的高质量数据去哪里找?

近期&#xff0c;OpenAI 在语音领域又带给我们惊喜&#xff0c;通过文本输入以及一段 15 秒的音频示例&#xff0c;可以生成既自然又与原声极为接近的语音。值得注意的是&#xff0c;即使是小模型&#xff0c;只需一个 15 秒的样本&#xff0c;也能创造出富有情感且逼真的声音。…

springboot3常用注解使用

组键注册注解 组件注册步骤总结 条件注解 演示示例 属性绑定注解 ConfigurationProperties进行绑定 EnableConfigurationProperties进行绑定 其他常用注解 EnableAutoConfiguration ComponentScan RequestMapping GetMapping PostMapping Autowired Resource Servi…

Objective-C大爆炸:从零到单例模式

oc学习笔记&#xff08;一&#xff09; 文章目录 oc学习笔记&#xff08;一&#xff09;oc与c语言的区别#import的用法foundation框架NSLog函数NSString类型符号的作用oc中的数据类型 类与对象概念&#xff1a; 创建第一个类类的定义类的实现类加载对象的产生和使用 self语法id…

为什么说B端SaaS产品经理需要让研发团队懂业务

先问是不是&#xff0c;再问为什么。这个问题即对也不对。 1.对的地方&#xff1a;研发团队里面的架构师、前后端leader、组长或者骨干如果懂业务的话&#xff0c;就能在做系统业务架构、信息架构和数据架构的时候多一些前瞻性&#xff0c;为后期业务扩展预留一些接口或者能力…

ElasticSearch面试题2

Mapping属性详细介绍/常见的字段数据类型&#xff1a; 映射(mapping)︰mapping是对索引库中文档的约束信息&#xff08;例如字段名、数据类型&#xff09;&#xff0c;类似表的结构约束&#xff1b;每个索引库都应该有自己的映射 数据库一定要先创建表才能去添加数据…

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…

yo!这里是网络入门初识

目录 前言 基本概念 网络 协议 地址 网络传输流程 OSI七层模型 TCP/IP四层&#xff08;五层&#xff09;模型 流程图 数据封装&&分用 后记 前言 对于上一个专栏——Linux操作系统&#xff0c;我们学习了操作系统的基础知识以及基本的系统编程&#xff0c;其…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台&#xff0c;在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序&#xff0c;它使得管理和监控Kafka集群变得简单直观。本文将…

ffmpeg音视频裁剪

音视频裁剪&#xff0c;通常会依据时间轴为基准&#xff0c;从某个起始点到终止点的音视频截取出来&#xff0c;当然音视频文件中存在多路流&#xff0c;所对每一组流进行裁剪 基础概念&#xff1a; 编码帧的分类&#xff1a; I帧(Intra coded frames): 关键帧&#xff0c;…

xLua热更新解决方案

图中灰色的无法实现热更新&#xff0c;而Lua代码可以打包成AB包&#xff0c;并上传到资源服务器&#xff0c; 当进入游戏检测是否有资源需要更新&#xff0c;需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

如何消除浏览器SmartScreen对网站“不安全”提示?

面对互联网时代用户对网站安全性和可信度的严苛要求&#xff0c;网站运营者时常遭遇Microsoft Defender SmartScreen&#xff08;SmartScreen&#xff09;提示网站不安全的困扰。本文将剖析SmartScreen判定网站不安全的原因&#xff0c;并为运营者提供应对策略&#xff0c;以恢…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

二、VLAN原理和配置

vlan不是协议&#xff0c;是一个技术&#xff0c;虚拟局域网技术&#xff0c;基于802.1q协议。 vlan&#xff08;虚拟局域网&#xff09;&#xff0c;将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…

Facebook的声音:听见社交媒体的心跳

社交媒体如今已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;承载着数以亿计的用户的交流、分享和连接。在这个信息爆炸的时代&#xff0c;Facebook的声音就像是社交媒体的心跳&#xff0c;传递着无数个体的情感、思想和生活。本文…

Python-VBA函数之旅-object基类(非函数)

目录 一、object基类的常见应用场景 二、object基类使用注意事项 三、如何用好object基类&#xff1f; 1、object基类&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、object基类的…