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.mzph.cn/diannao/5064.shtml

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

相关文章

LT6911UXE HDMI 2.0 至双端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXE 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.3。对于 MIPI DSI / CSI 输出&#xff0…

零基础HTML教程(30)--迈入HTML5新时代

文章目录 1. 从H4时代到H5时代2. 属性值可以不用引号3. 标签使用大小写均可4. 部分属性值可以省略5. 浏览器支持情况6. 小结 1. 从H4时代到H5时代 之前讲的29篇HTML教程&#xff0c;内容基本都是H4时代就有的。 随着时代的发展&#xff0c;H4多少有点不够用&#xff0c;所以H…

pyQt5 和 Qt Designer 实现登录注册案例

Qt Designer 设计页面: 通过 PyQt5 手写 1. 先引入用到的库 from PyQt5.QtWidgets import * import sys 2. 创建应用,窗口, 设置窗口 # 创建应用 app QApplication(sys.argv) # 创建窗口 w QWidget()# 设置窗口标题 w.setWindowTitle("注册登录")# 展示 w.sho…

HaLo-NeRF:利用视觉和语言模型对场景的精准定位和细粒度语义理解

包含大量摄影师拍摄的照片的互联网图像集有望实现对大型旅游地标的数字探索。然而&#xff0c;先前的工作主要集中在几何重建和可视化上&#xff0c;忽略了语言在为导航和细粒度理解提供语义界面方面的关键作用。 项目&#xff1a;HaLo-NeRF: Learning Geometry-Guided Semant…

LeetCode - 129双周赛

目录 一&#xff0c;3127. 构造相同颜色的正方形 二&#xff0c;3128. 直角三角形 三&#xff0c;3129. 找出所有稳定的二进制数组 I ​编辑 四&#xff0c;3130. 找出所有稳定的二进制数组 II 一&#xff0c;3127. 构造相同颜色的正方形 本题就是问在一个3x3的正方形中是…

2024.4.25 LoadRunner 测试工具详解 —— Controller Analysis

目录 Controller 的使用 创建场景 Controller 快捷方式创建场景 VUG 针对写好脚本创建场景 场景设计 设计初始化 设计启动机制 设计性能测试脚本的执行时间 设计虚拟用户退出机制 场景运行 添加监控指标至图标格区域 Analysis 的使用 汇总报告 测试报表 吞吐量图 …

仿9377登录注册页面源码分享

LOGO在image里面修改,名字这些有记事本打开修改 仿9377登录注册页面源码分享

《HelloGitHub》第 97 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

《Python语言科研绘图与学术图表绘制从入门到精通》解锁Python语言绘图魅力,让数据可视化成为你的科研利器!

本书特点 1.零基础高效入门&#xff1a;通过软件操作、实战案例及图文、代码结合的方式&#xff0c;实现从入门到精通的快速学习。 2.掌握多元科研绘图&#xff1a;涵盖科研绘图基础、各类图形绘制技巧&#xff0c;包括变量、极坐标、2D、3D及地理信息可视化等。 3.实用与艺术…

学习 Rust 第 22 天:mini_grep 第 2 部分

书接上文&#xff0c;在本文中&#xff0c;我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试&#xff0c;我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念&#xff0c;例如错误处理、环境…

Coursera: An Introduction to American Law 学习笔记 Week 06: Civil Procedure (完结)

An Introduction to American Law Course Certificate Course Introduction 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 06: Civil Pro…

Python使用设计模式中的建筑模式将数据写入Excel且满足条件内容标红

对于这个任务&#xff0c;适合使用"Builder"设计模式。Builder模式的主要目的是将对象的构建与其表示分离&#xff0c;以便相同的构建过程可以创建不同的表示。在这个情况下&#xff0c;我们需要一个构建器来逐行构建Excel表格&#xff0c;并根据给定的数据添加相应的…

GoF之工厂模式

GoF之工厂模式 文章目录 GoF之工厂模式每博一文案1. 简单说明“23种设计模式”1.2 介绍工厂模式的三种形态1.3 简单工厂模式&#xff08;静态工厂模式&#xff09;1.3.1 简单工厂模式的优缺点: 1.4 工厂方法模式1.4.1 工厂方法模式的优缺点: 1.5 抽象工厂模式1.6 抽象工厂模式的…

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…

C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点

类与对象&#xff08;上&#xff09;&#xff1a;C初阶学习第三弹——类与对象&#xff08;上&#xff09;——初始类与对象-CSDN博客 前言&#xff1a; 在前面文章中&#xff0c;我们已经讲了类与对象的思想和类与对象的一些基本操作&#xff0c;接下来这篇文章我们将讲解以下…

探索Jellyfin:支持Android的自由开源的媒体服务器平台

探索Jellyfin&#xff1a;支持Android的自由开源的媒体服务器平台 I. 简介 A. 什么是Jellyfin&#xff1f; Jellyfin是一个自由开源的媒体服务器平台&#xff0c;旨在让用户能够自主管理和流式传输他们的媒体内容。与许多闭源的商业媒体服务器解决方案不同&#xff0c;Jelly…

Matlab各个版本介绍、区别分析及推荐

MATLAB&#xff0c;由美国MathWorks公司出品&#xff0c;是一款广泛应用的商业数学软件。自其诞生之初&#xff0c;MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域&#xff0c;赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

ubuntu neo4j 下载与配置(一)

neo4j 官方下载页面 https://neo4j.com/deployment-center/#community 进入页面之后&#xff0c;往下滑 咱们在下载neo4j时&#xff0c;官方可能要咱们填写一下个人信息&#xff0c;比如&#xff1a;姓名组织结构邮箱等&#xff1a; 咱们可以观察一下&#xff0c;ne4j的下载链…

如何下载钉钉群直播回放:完整步骤解析

在当今快节奏的商业和教育环境中&#xff0c;钉钉群直播已经成为了沟通和学习的重要工具。直播结束后&#xff0c;很多观众都希望回顾内容&#xff0c;但却不知如何开始。如果你错过了实时直播&#xff0c;或者只是想再次观看精彩的演讲和讨论&#xff0c;那么下载钉钉群直播回…

基于ESP32—CAM物联网WIFI小车

一.功能概述 摄像头的画面可以实时的传输到&#xff0c;点灯科技APP的手机端&#xff0c;这样可以实时查看周围环境的状况&#xff0c;灯光不足&#xff0c;画面不清晰时可以打开灯光照明。手机端有左转、右转、前进、后退、停止的按钮。可以根据自己需要&#xff0c;来控制小车…