当前位置: 首页 > news >正文

WebSocket的应用场景与案例解析

WebSocket是一种网络通信协议,它支持在单个TCP连接上进行全双工通信,允许服务器主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现真正的双向平等对话。WebSocket技术基于TCP协议,与HTTP协议具有良好的兼容性,数据格式轻量且性能开销小,可以发送文本和二进制数据,没有同源限制,适用于多种应用场景,如在线聊天、实时游戏、股票行情更新等。

WebSocket 介绍

WebSocket的实现原理相对简单,通过在HTTP协议中添加Upgrade头部来告知服务器需要升级协议。如果服务器支持WebSocket协议,则返回101状态码表示协议升级成功,之后客户端和服务器就可以通过WebSocket协议进行实时通信 。

WebSocket技术的特点包括:

  1. 实时性高:WebSocket可以实现实时通信,传输数据的延迟更低。
  2. 减少网络带宽使用:通过建立持久化连接,减少了HTTP协议中每次请求和响应所需的网络带宽。
  3. 双向通信:支持全双工通信,客户端和服务器可以同时发送和接收数据。
  4. 跨域支持:支持跨域通信。
  5. 安全性高:可以通过SSL/TLS协议实现加密通信 。

WebSocket的应用场景广泛,例如:

  • 实时通信:如在线聊天、实时游戏等。
  • 数据推送:服务器端可以主动向客户端推送数据,如股票行情、天气预报等。
  • 实时监控:如视频监控、设备状态监控等 。

使用WebSocket技术时,需要先创建WebSocket对象,然后通过该对象与服务器进行通信。WebSocket对象的常用方法包括:

  • open():打开WebSocket连接。
  • send():向服务器发送数据。
  • close():关闭WebSocket连接 。

WebSocket与HTTP协议相比,具有以下优势:

  • 构建速度快:使用类似浏览器工作方式的模块机制,大大加速了构建速度。
  • 构建结果小:仅编译改动的模块,打包结果更小。
  • 开发调试快:支持实时增量重新编译,快速响应保存的修改。
  • 配置少:基于ES modules,支持现代浏览器特性,配置简单。
  • 易于集成:支持Vue、React等主流前端框架,并提供原生SSR功能。

在线聊天案例

接下来,V哥基于WebSocket,创建一个在线聊天功能的案例,方便用更好的理解 WebSocket 的应用,以下代码会涉及到前端和后端的编写。来开干:

步骤1:设置后端WebSocket服务器

我们可以使用Node.js和ws库来创建WebSocket服务器。

  1. 初始化Node.js项目并安装ws库:
   mkdir websocket-chatcd websocket-chatnpm init -ynpm install ws
  1. 创建server.js文件并编写WebSocket服务器代码:
   const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });const clients = new Set();wss.on('connection', function connection(ws) {clients.add(ws);ws.on('message', function incoming(message) {console.log('received: %s', message);clients.forEach(client => {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});ws.on('close', () => {clients.delete(ws);});});console.log('WebSocket server started on ws://localhost:8080');

步骤2:创建前端页面

  1. 在项目根目录下创建index.html文件:
   <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket Chat</title></head><body><h1>WebSocket Chat</h1><input type="text" id="messageInput" placeholder="Type a message..."><button id="sendButton">Send</button><ul id="messagesList"></ul><script src="chat.js"></script></body></html>
  1. 创建chat.js文件并编写前端逻辑:
   const ws = new WebSocket('ws://localhost:8080');const messageInput = document.getElementById('messageInput');const sendButton = document.getElementById('sendButton');const messagesList = document.getElementById('messagesList');sendButton.addEventListener('click', () => {const message = messageInput.value;if (message) {ws.send(message);messageInput.value = '';}});ws.onmessage = (event) => {const messageItem = document.createElement('li');messageItem.textContent = event.data;messagesList.appendChild(messageItem);};ws.onopen = () => {console.log('Connected to the WebSocket server.');};ws.onclose = () => {console.log('Disconnected from the WebSocket server.');};ws.onerror = (error) => {console.error('WebSocket error:', error);};

步骤3:运行WebSocket服务器和前端页面

  1. 启动WebSocket服务器:
   node server.js
  1. 打开浏览器并访问file:///path/to/websocket-chat/index.html,替换/path/to/websocket-chat/为你的项目路径。

步骤解析:

  • 服务器端:创建了一个WebSocket服务器,监听8080端口。每当有新连接时,它会将客户端添加到clients集合中。当收到消息时,服务器会将消息广播给所有其他客户端。
  • 客户端:在浏览器中创建了一个WebSocket连接。用户输入消息并点击发送按钮时,消息通过WebSocket发送到服务器。客户端还监听服务器发回的消息,并将其显示在消息列表中。

天气预报案例

创建一个基于WebSocket的数据推送天气预报功能,下面 V 哥通过一个案例来演示一下,其中包括一个后端服务器,负责推送天气更新,以及一个前端页面,用于显示实时天气信息。以下是详细的步骤说明和代码解析:

步骤1:设置后端WebSocket服务器

使用Node.js和ws库创建WebSocket服务器。

  1. 初始化Node.js项目并安装所需库:
   mkdir weather-websocketcd weather-websocketnpm init -ynpm install ws
  1. 创建server.js文件并编写WebSocket服务器代码:
   const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8080 });const weatherData = {temperature: 22, // 假设温度condition: 'sunny' // 假设天气情况};// 定时更新天气数据,模拟实时数据源setInterval(() => {weatherData.temperature = Math.floor(Math.random() * 30); // 随机生成温度weatherData.condition = ['sunny', 'cloudy', 'rainy'][Math.floor(Math.random() * 3)];wss.clients.forEach(client => {if (client.readyState === WebSocket.OPEN) {client.send(JSON.stringify(weatherData));}});}, 5000); // 每5秒更新一次console.log('WebSocket server started on ws://localhost:8080');

步骤2:创建前端页面

  1. 在项目根目录下创建index.html文件:
   <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Weather Forecast</title></head><body><h1>Live Weather Forecast</h1><div><p>Temperature: <span id="temperature">--</span>°C</p><p>Condition: <span id="condition">--</span></p></div><script src="app.js"></script></body></html>
  1. 创建app.js文件并编写JavaScript代码来处理WebSocket连接和UI更新:
   const ws = new WebSocket('ws://localhost:8080');const temperatureDisplay = document.getElementById('temperature');const conditionDisplay = document.getElementById('condition');ws.onmessage = (event) => {const weather = JSON.parse(event.data);temperatureDisplay.textContent = weather.temperature;conditionDisplay.textContent = weather.condition;};ws.onopen = () => {console.log('Connected to the weather WebSocket server.');};ws.onclose = () => {console.log('Disconnected from the weather WebSocket server.');};ws.onerror = (error) => {console.error('WebSocket error:', error);};

步骤3:运行WebSocket服务器和前端页面

  1. 启动WebSocket服务器:
   node server.js
  1. 在浏览器中打开file:///path/to/weather-websocket/index.html,替换/path/to/weather-websocket/为你的项目路径。

步骤解析:

  • 服务器端:创建了一个WebSocket服务器,监听8080端口。服务器端使用setInterval函数每5秒更新一次天气数据,并将更新推送给所有连接的客户端。
  • 客户端:在浏览器中创建了一个WebSocket连接。客户端监听服务器发送的消息,并更新页面上的温度和天气状况。

注意哦,在实际应用中,天气数据可能来自外部API,如果需要可以在聚合数据上找到,并且需要对数据进行身份验证和加密等安全措施。

最后

WebSocket是一种强大的通信技术,适用于需要实时通信和高交互性的应用场景。掌握利用WebSocket技术,是前端开发的必备技能。欢迎关注威哥爱编程,一起交流学习,不喜勿喷哦。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自然语言处理系列三十三》 语义相似度》同义词词林》算法原理
  • 构建高效的串行任务执行器:SerialExecutor深度解析
  • 长视频生成研究的挑战、方法与前景
  • Nginx知识详解(理论+实战更易懂)
  • 浏览器非安全端口号
  • 单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(二)硬件电路设计
  • 咸鱼之王手游内购修复无bug运营版联网架设+后台
  • CSP 2023 提高级第一轮 CSP-S 2023初试题 程序阅读第三题解析
  • 多功能秒达工具箱全开源源码,可自部署且完全开源的中文工具箱
  • SQL查询数据库public架构下所有表格的主键/复合(组合)键的方法
  • 【运维】docker搭建portainer
  • c++题目_P1168 中位数
  • 面向对象03:创建对象内存分析
  • Qt第十八章 XML和Json格式解析
  • 理解Flink数据流图
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • axios 和 cookie 的那些事
  • canvas 绘制双线技巧
  • ES6简单总结(搭配简单的讲解和小案例)
  • IDEA 插件开发入门教程
  • Java比较器对数组,集合排序
  • Java读取Properties文件的六种方法
  • magento 货币换算
  • MD5加密原理解析及OC版原理实现
  • Object.assign方法不能实现深复制
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React16时代,该用什么姿势写 React ?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 你不可错过的前端面试题(一)
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用common-codec进行md5加密
  • 项目管理碎碎念系列之一:干系人管理
  • 用jquery写贪吃蛇
  • 与 ConTeXt MkIV 官方文档的接驳
  • 找一份好的前端工作,起点很重要
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​数据链路层——流量控制可靠传输机制 ​
  • ###项目技术发展史
  • #{}和${}的区别?
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (09)Hive——CTE 公共表达式
  • (pytorch进阶之路)扩散概率模型
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (七)Java对象在Hibernate持久化层的状态
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)WLAN定义和基本架构转
  • (转)VC++中ondraw在什么时候调用的
  • (转)程序员技术练级攻略
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (自用)交互协议设计——protobuf序列化
  • ***通过什么方式***网吧
  • .NET C# 操作Neo4j图数据库