在项目中使用WebSocket实现实时通信

WebSocket提供了一种在客户端和服务器之间建立持久连接的方式,可以实现实时数据交换。下面我将展示如何在前端项目中集成WebSocket功能。

设计思路

我将创建一个简单的聊天室界面来演示WebSocket的使用,包含以下功能:

  • 建立WebSocket连接
  • 发送和接收消息
  • 显示连接状态
  • 错误处理和重连机制

实现代码

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天室</title><style>* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;line-height: 1.6;color: #333;background-color: #f5f7fa;padding: 20px;}.container {max-width: 800px;margin: 0 auto;background: white;border-radius: 10px;box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);overflow: hidden;}header {background: #4a6ee0;color: white;padding: 20px;text-align: center;}.status-bar {display: flex;justify-content: space-between;align-items: center;padding: 10px 20px;background: #f0f4ff;border-bottom: 1px solid #e0e6ff;}.status {display: flex;align-items: center;}.status-indicator {width: 10px;height: 10px;border-radius: 50%;margin-right: 8px;}.connected {background: #4caf50;}.disconnected {background: #f44336;}.chat-container {padding: 20px;height: 400px;overflow-y: auto;background: #fafbff;}.message {margin-bottom: 15px;padding: 10px 15px;border-radius: 18px;max-width: 80%;word-break: break-word;}.received {background: #e6eeff;border-top-left-radius: 4px;align-self: flex-start;}.sent {background: #4a6ee0;color: white;border-top-right-radius: 4px;margin-left: auto;}.message-input {display: flex;padding: 15px;border-top: 1px solid #e0e6ff;background: #fafbff;}input {flex: 1;padding: 12px 15px;border: 1px solid #d0d9ff;border-radius: 20px;outline: none;font-size: 16px;}button {background: #4a6ee0;color: white;border: none;border-radius: 20px;padding: 12px 20px;margin-left: 10px;cursor: pointer;font-weight: bold;transition: background 0.3s;}button:hover {background: #3a5ec0;}button:disabled {background: #cccccc;cursor: not-allowed;}</style>
</head>
<body><div class="container"><header><h1>WebSocket 聊天室</h1></header><div class="status-bar"><div class="status"><div class="status-indicator disconnected" id="statusIndicator"></div><span id="statusText">未连接</span></div><button id="connectButton">连接</button></div><div class="chat-container" id="chatContainer"><div class="message received">欢迎使用聊天室!请点击"连接"按钮开始。</div></div><div class="message-input"><input type="text" id="messageInput" placeholder="输入消息..." disabled><button id="sendButton" disabled>发送</button></div></div><script>document.addEventListener('DOMContentLoaded', function() {const statusIndicator = document.getElementById('statusIndicator');const statusText = document.getElementById('statusText');const connectButton = document.getElementById('connectButton');const chatContainer = document.getElementById('chatContainer');const messageInput = document.getElementById('messageInput');const sendButton = document.getElementById('sendButton');let websocket = null;const serverUrl = 'wss://echo.websocket.org'; // 这是一个公共的WebSocket测试服务器// 更新连接状态UIfunction updateConnectionStatus(connected) {if (connected) {statusIndicator.className = 'status-indicator connected';statusText.textContent = '已连接';connectButton.textContent = '断开';messageInput.disabled = false;sendButton.disabled = false;} else {statusIndicator.className = 'status-indicator disconnected';statusText.textContent = '未连接';connectButton.textContent = '连接';messageInput.disabled = true;sendButton.disabled = true;}}// 添加消息到聊天窗口function addMessage(content, isSent = false) {const messageElement = document.createElement('div');messageElement.className = `message ${isSent ? 'sent' : 'received'}`;messageElement.textContent = content;chatContainer.appendChild(messageElement);// 滚动到底部chatContainer.scrollTop = chatContainer.scrollHeight;}// 建立WebSocket连接function connect() {try {websocket = new WebSocket(serverUrl);websocket.onopen = function(event) {updateConnectionStatus(true);addMessage('已连接到服务器');};websocket.onmessage = function(event) {addMessage(event.data);};websocket.onclose = function(event) {updateConnectionStatus(false);addMessage('连接已关闭');websocket = null;};websocket.onerror = function(error) {console.error('WebSocket错误:', error);addMessage('发生错误,连接已断开');updateConnectionStatus(false);};} catch (error) {console.error('无法建立连接:', error);addMessage('无法连接到服务器: ' + error.message);updateConnectionStatus(false);}}// 关闭WebSocket连接function disconnect() {if (websocket) {websocket.close();}}// 发送消息function sendMessage() {const message = messageInput.value.trim();if (message && websocket && websocket.readyState === WebSocket.OPEN) {websocket.send(message);addMessage(message, true);messageInput.value = '';}}// 连接/断开按钮点击事件connectButton.addEventListener('click', function() {if (websocket && websocket.readyState === WebSocket.OPEN) {disconnect();} else {connect();}});// 发送按钮点击事件sendButton.addEventListener('click', sendMessage);// 按Enter键发送消息messageInput.addEventListener('keypress', function(event) {if (event.key === 'Enter') {sendMessage();}});});</script>
</body>
</html>

使用说明

  1. 页面加载后,点击"连接"按钮建立WebSocket连接
  2. 连接成功后,可以在输入框中输入消息并点击"发送"或按Enter键
  3. 发送的消息会显示在右侧(蓝色),接收的消息显示在左侧(浅蓝色)
  4. 可以随时点击"断开"按钮结束连接

实际项目中的注意事项

  1. 生产环境URL:示例中使用的是测试服务器,实际项目中应替换为您的WebSocket服务器地址
  2. 安全连接:生产环境应使用wss://(WebSocket Secure)而不是ws://
  3. 错误处理:需要根据实际需求完善错误处理和重连机制
  4. 身份验证:实际应用中通常需要在建立连接时进行身份验证
  5. 数据格式:通常使用JSON格式进行复杂数据交换

扩展功能

在实际项目中,您可能需要添加:

  • 心跳机制保持连接活跃
  • 消息重发机制确保消息送达
  • 连接状态监控和自动重连
  • 支持不同的消息类型(文本、图片、文件等)
  • 用户身份标识和会话管理

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

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

相关文章

电磁流量计可靠品牌之选,基恩士提供多样化解决方案

引言在工业自动化领域&#xff0c;流量的精确计量是保障产品质量、优化成本和提升设备效率的关键一环。当面临“电磁流量计的可靠品牌”这一问题时&#xff0c;企业通常需要考量产品的耐用性、测量精度、维护成本以及系统集成能力。流量计在安装、维护和测量精度方面面临诸多挑…

NumPy数组与Python列表的赋值行为解析

在Python科学计算中&#xff0c;NumPy数组和Python原生列表是两种常用的数据结构。理解它们之间的赋值行为差异对于编写高效、正确的代码至关重要。本文将深入探讨NumPy数组赋值给Python变量的各种情况&#xff0c;揭示背后的内存机制和类型转换特性。 直接赋值行为分析 当我们…

中国制造难点在哪里?

最近生产一批板子&#xff0c;其中一个进口的连接器为什么能卖我们差不多一千多钱还没现货&#xff0c;有时候还禁售&#xff1b;规格书也就寥寥一页而已&#xff0c;外观看起来也淡淡无奇&#xff0c;身为制造业强国的我们为什么没人做呢&#xff1f;你们怎么看&#xff1f;#中…

python 读取大文件优化示例

核心方法逐行读取 - 最常用&#xff0c;内存占用O(1)分块读取 - 适合超大文件&#xff0c;可控制内存使用内存映射 - 高性能&#xff0c;虚拟内存映射缓冲读取 - 平衡性能和内存特殊场景处理CSV文件 - 使用pandas的chunksize参数JSON Lines - 逐行解析JSON对象文本分析 - 内存高…

VBA数据结构深度解析:字典对象与集合对象的性能终极对决

VBA数据结构大揭秘:Dictionary与Collection,谁才是性能王者? 某头部券商的风控系统曾遭遇"数据黑洞"危机:使用Collection处理10万条交易记录时,系统响应时间长达47秒,而改用Dictionary后仅需3.2秒——效率差距达14.7倍!这背后是VBA开发者普遍存在的认知盲区:…

【系统分析师】2025年上半年真题:论文及解题思路

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 试题一:论信息系统运维管理技术与应用 试题二:论软件系统测试方法及应用 试题三:论信息系统开发方法及应用 试题四:论模型驱动分析方法及应用 试题一:论信息系统运维管理技术与应用 智能运维(AIOps)是以人工智能…

立创·庐山派K230CanMV开发板的进阶学习——颜色识别

学习目标&#xff1a;立创庐山派K230CanMV开发板的进阶学习——颜色识别学习内容&#xff1a;颜色识别 颜色识别 1. 本节介绍 &#x1f4dd; 学习内容&#xff1a;本节将学习基于颜色阈值的色块检测技术&#xff0c;通过定义特定颜色范围&#xff0c;从摄像头采集的图像中识别并…

【实时Linux实战系列】V4L2 采集零拷贝:DMA-BUF 在低延迟视频中的应用

在实时视频处理系统中&#xff0c;视频帧的高效传输和处理是确保系统低延迟和高吞吐量的关键。传统的视频采集和处理流程中&#xff0c;数据拷贝是一个常见的性能瓶颈&#xff0c;它不仅增加了处理延迟&#xff0c;还可能导致帧间抖动。为了克服这些问题&#xff0c;Linux 提供…

STM32精准控制水流

如何用STM32精准控制水的流量&#xff1f;一、系统组成框图------------- ------------ ----------- -------------| | | | | | | || 流量传感器 -----> STM32 ----->| 驱动电路 ----->…

吃透 Vue 样式穿透:从 scoped 原理到组件库样式修改实战

在 Vue 项目开发中&#xff0c;我们经常会引入 Element Plus、Vant、Ant Design等成熟组件库来提升开发效率。但即便组件库提供了基础样式配置&#xff0c;实际业务中仍需根据设计需求调整组件内部细节样式——这时候&#xff0c;「样式穿透」就成了必须掌握的技能。而要理解样…

记一次维修网桥经历

1.前言 前俩天突然下大雨了&#xff0c;大雨过后我也迎来断网时刻&#xff0c;经过简单排查发现是网络的网桥这条线路无法连通。 猜测1 可能是网线损坏&#xff0c;2 网桥损坏 2.拆解 经过测试网线设备后发现是网桥的问题&#xff0c;尝试reset发现无反应&#xff08;正常情况重…

OceanBase001-入门--里面有的概念不确定文章作为了解使用

目录资料来源特点支持和不支持的点名词概念租户资源池租户使用资源数据库表分区示例资料来源 B站视频 点击跳转 特点 分两个版本 企业版支持Oracle 和MySql 社区版本支持 MySql 这里视频这么讲解的。后续有没有社区版本什么样子不知道&#xff0c;请不要喷我 单节点部署 兼…

KITTI数据集

KITTI数据集是由德国卡尔斯鲁厄理工学院 Karlsruhe Institute of Technology (KIT) 和美国芝加哥丰田技术研究院 Toyota Technological Institute at Chicago (TTI-C) 于2012年联合创办&#xff0c;是目前国际上最为常用的自动驾驶场景下的计算机视觉算法评测数据集之一。该数据…

rk3568移植WebRTC AudioProcessing

前言&#xff1a; 大家好&#xff0c;我是飞一样的成长&#xff0c;今天这篇文章主要想分享音频3A的内容。在之前有网友找我怎么移植原生的webrtc到rk3568/rk3588上&#xff0c;当时我自己也没有移植过&#xff0c;后面折腾了一个礼拜才搞定&#xff0c;当时遇到的最大问题&…

介绍一下 RetNet

RetNet&#xff08;Retention Network&#xff09;是微软亚洲研究院于 2023 年提出的一种新型序列建模架构&#xff0c;旨在解决 Transformer 架构在长序列处理中存在的计算复杂度高、内存占用大、推理速度慢等核心问题。它通过创新的 “循环注意力机制”&#xff0c;实现了 “…

CANopen - PDO映射

CiA402为什么不放到一个PDO中。而是分成几个PDO? 简短答案&#xff1a;装不下 解耦时序。 PDO负载上限&#xff1a;经典CAN的每个PDO只有8字节。TargetPosition(607A:0032bit) ProfileVelocity(60FF:0032bit) ModesOfOperation(6060:008bit) 共9字节&#xff0c;单个PDO放不…

北理工提出仅依赖机载传感器针对IAP的控制与状态估计框架

近日&#xff0c;度量用户、北京理工大学俞玉树老师团队在IEEE RAL&#xff0c;IEEE TRO和IEEE TASE期刊上分别发表论文&#xff0c;研究着力于解决多飞行器集联平台&#xff08;Integrated Aerial Platforms, IAPs&#xff09;的相对位姿和全局定位问题&#xff0c;提出IAP的控…

13年测试老鸟,性能测试-618与双11大促销压测(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、准备工作 准备…

StreamCap(直播录制) v1.0.2 绿色版

StreamCap 是一个基于FFmpeg和StreamGet的多平台直播流录制客户端&#xff0c;覆盖 40 国内外主流直播平台&#xff0c;支持批量录制、循环监控、定时监控和自动转码等功能。软件特色 多端支持&#xff1a;支持Windows/MacOS/Web运行。循环监控&#xff1a;实时监控直播间状态&…

OpenCV:图像拼接(SIFT 特征匹配 + 透视变换)

目录 一、核心技术原理与对应 API 解析 1.1 SIFT 特征检测与描述&#xff08;尺度不变特征提取&#xff09; 1.1.1 灰度图转换&#xff1a;cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 1.1.2 SIFT 检测器初始化&#xff1a;cv2.SIFT_create() 1.1.3 特征点检测与描述符计算&…