前端项目中使用 WebSocket 的实践指南

WebSocket 是一种在浏览器和服务器之间建立持久连接的现代方式,它允许服务器和客户端之间进行实时、双向通信。本文将详细介绍在前端项目中使用 WebSocket 的初始化、发送信息、报错及关闭时的处理,以及 WebSocket 在浏览器中的连接机制,解释为何在未发送或接收消息时会自动关闭。

一、WebSocket 的初始化

在前端项目中,使用 WebSocket 首先需要创建一个 WebSocket 对象,并指定连接的 URL。以下是一个简单的示例:
HTML复制
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>WebSocket Demo</title><script>var ws = new WebSocket('ws://localhost:8080/echo');ws.onopen = function() {console.log('WebSocket 连接已经建立。');ws.send('Hello, server!');};ws.onmessage = function(event) {console.log('收到服务器消息:', event.data);};ws.onerror = function(event) {console.error('WebSocket 连接出现错误:', event);};ws.onclose = function() {console.log('WebSocket 连接已经关闭。');};</script>
</head>
<body><h1>WebSocket Demo</h1>
</body>
</html>
在这个示例中,我们创建了一个 WebSocket 对象,并指定了连接的 URL ws://localhost:8080/echo。通过注册 onopenonmessageonerroronclose 事件处理器来处理不同的事件。

二、发送信息

一旦 WebSocket 连接成功建立,就可以通过 send 方法向服务器发送消息。例如:
ws.send('Hello, server!');
在实际应用中,发送的消息可以是字符串、Blob、ArrayBuffer 等类型。例如,发送一个 JSON 对象:
var message = { name: 'zhangsan', age: 18 };
ws.send(JSON.stringify(message));

三、报错处理

WebSocket 连接可能会遇到各种错误,例如网络问题、服务器故障等。通过 onerror 事件处理器可以捕获这些错误,并进行相应的处理。例如:
ws.onerror = function(event) {console.error('WebSocket 连接出现错误:', event);// 可以在这里进行重连操作ws.close();
};
在捕获到错误后,通常需要关闭 WebSocket 连接,并根据应用的需求决定是否重新连接。

四、关闭处理

WebSocket 连接可以通过 close 方法主动关闭。例如:
ws.close();
也可以传递关闭代码和原因说明参数,例如:
ws.close(1000, "Deliberate disconnection");
在页面卸载时,应确保 WebSocket 连接被正确关闭,以释放资源。例如:
window.onbeforeunload = function() {if (ws.readyState === WebSocket.OPEN) {ws.close();}
};

五、WebSocket 在浏览器中的连接机制

WebSocket 在浏览器中的连接机制如下:
  1. 握手过程:客户端通过 HTTP 请求发起 WebSocket 连接请求,服务器响应并建立 WebSocket 连接。
  2. 数据传输:一旦连接建立,客户端和服务器可以双向发送和接收消息。
  3. 心跳机制:为了保持连接的活跃状态,通常需要实现心跳机制。客户端定期向服务器发送心跳消息(如 PING),服务器收到后回复 PONG 消息。如果在一定时间内没有收到心跳回复,客户端可以认为连接已断开,并进行重连操作。

六、自动关闭的原因

WebSocket 在浏览器中未发送或接收消息时会自动关闭,主要原因如下:
  1. 网络超时:如果在一定时间内没有数据传输,网络层可能会认为连接已闲置并自动关闭。
  2. 服务器配置:服务器可能配置了超时机制,如果在超时时间内没有收到客户端的消息,服务器会主动关闭连接。
  3. 心跳机制缺失:如果没有实现心跳机制,连接可能会因为长时间没有数据交互而被关闭。
通过实现心跳机制,可以有效避免因长时间无数据交互导致的自动关闭问题。

七、总结

WebSocket 是一种强大的网络通信协议,适用于需要实时、双向通信的应用场景。在前端项目中,通过合理使用 WebSocket 的初始化、发送信息、报错及关闭处理,可以实现稳定可靠的实时通信。同时,了解 WebSocket 在浏览器中的连接机制,特别是心跳机制,可以有效避免连接自动关闭的问题,确保应用的实时性和稳定性。

八、示例

connectWebSocket() {console.log('WebSocket连接中...');try {if (!this.webSocket) {const webSocket = new WebSocket(window.bffConfig.WS_URL);webSocket.onopen = (event) => {console.log('WebSocket连接已打开');this.webSocketStatus = true;webSocket.send(JSON.stringify({ action: 'authenticate', user_id: this.userInfo?.id, timestamp: Date.now() }));};webSocket.onmessage = (event) => {const message = event.data;console.log('WebSocket收到消息:', message);if (message && isJSONString(message)) {const data = JSON.parse(message);Number(data?.project_id) === this.selectedProject?.id && this.getAIStatus();}};webSocket.onerror = (event) => {console.error('WebSocket错误:', event);this.webSocketStatus = false;setTimeout(this.connectWebSocket(), 1000);};webSocket.onclose = (event) => {console.log('WebSocket连接已关闭');this.webSocketStatus = false;this.webSocket = null;setTimeout(this.connectWebSocket(), 1000);};runInAction(() => {this.webSocket = webSocket;});}} catch (error) {console.log('WebSocket连接失败:', error);this.webSocketStatus = false;setTimeout(this.connectWebSocket(), 1000);}}

 

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

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

相关文章

Catlike Coding Custom SRP笔记 - SRP项目搭建

什么是SRP? 可编程渲染管线 (Scriptable Render Pipeline) 是 Unity 内置渲染管线的替代方案。 使用 SRP 可以通过 C# 脚本控制和定制渲染流程URP和SRP的区别? URP是基于SRP实现的一套渲染管线(由Unity官方实现,并以模板项目的方式提供给开发者使用)LWRP又是啥? 轻量级渲…

使用 Perspective 为 AI 艺术添加真实世界的深度

使用 Perspective 为 AI 艺术添加真实世界的深度 📖阅读时长:10分钟 🕙发布时间使用 Perspective 为 AI 艺术添加真实世界的深度 📖阅读时长:10分钟 🕙发布时间:2025-01-16近日热文:全网最全的神经网络数学原理(代码和公式)直观解释 欢迎关注知乎和公众号的专栏内…

字节跳动发布开源 Lip Sync AI 模型,视频换声对口型超轻松!

ByteDance新开源模型LatentSync,视频换声对口型超轻松! 阅读时长:9分钟 论文地址ByteDance新开源模型LatentSync,视频换声对口型超轻松!阅读时长:9分钟 论文地址: https://arxiv.org/pdf/2412.09262 发布时间:2025年1月8日字节跳动最近推出了LatentSync,这是一款全新的…

MobaXterm(远程终极工具箱) v24.4汉化专业版

MobaXterm是一款集多种远程功能于一身的工具,它通过支持SSH、Telnet、RDP、VNC等协议,让用户能够轻松远程连接至不同操作系统,如Linux、Unix和Windows。此外,它还具备文件传输功能,支持SCP、SFTP、FTP协议,方便用户在本地与远程设备间传输文件。关键特性图形界面支持:可…

https证书一键自动续期,帮你解放90天限制

前言 前几天网站证书到期,发觉证书颁发每次只能90天有效期,这谁能忍受,于是乎发觉网上有免费的一键续期脚本,真正解放我们的双手。项目如下acme.sh。 期间由于"墙"的原因,踩了很多的坑,此文记录一下踩坑的过程,同时也帮助我们"墙内"的程序员,不需要…

对rpc长连接与短连接的思考

RPC项目中长连接和短连接各有优劣,长连接适用于少量客户端,提高效率;短连接则更适合大量客户端,避免服务器过载。结合L4和L7负载均衡,合理选择连接方式,提升系统性能和稳定性。对rpc长连接与短连接的思考 对于rpc项目,在接受大佬指导的时候曾问过对于长连接和短连接是如…

【Windows攻防】通过代码研究空字节和无文件方式注册表隐藏技术

这篇文章收录于《取证实录》第四季中。 注册表隐藏技术通常用于恶意软件、后门程序或攻击者企图在系统中保持隐蔽,绕过安全检查和防御系统。 常见的隐藏技术有:使用非法字符隐藏注册表项(如PlugX、TDL4/Alureon(Rootkit))、利用默认键值(空字符串)隐藏(如Adwind RAT)…

DVWA靶场学习

暴力破解Brute Force low 输入密码就正常抓包放字典破解得了uploading-image-528180.png medium 同样的操作发现响应速度变慢了,但是还是能暴力破解,不多说了。 uploading-image-408161.png 部分源码解读 $user = $_GET[username]; $user = ((isset($GLOBALS["___mysqli…

推荐几个不错的 Linux 服务器管理工具

前言 选择一款好的 Linux 服务器管理工具能够极大地提高运维效率,保障业务连续性。今天大姚给大家分享3款不错的 Linux 服务器管理工具,希望可以帮助到有需要的同学。 1Panel 1Panel是新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服…

学习进度笔记⑩

Tensorflow线性回归 源代码:import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport osos.environ["CUDA_VISIBLE_DEVICES"]="0"#设置训练参数,learning_rate=0.01,training_epochs=1000,display_step=50learning_rate=0.01…

学习进度笔记⑨

tensorflow基本操作(类似numpy) 源代码import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"]="0" #构造计算图,创建两个常量节点a,b,值分别为2,3 a=tf.constant(2) b=tf.constant(3) #创建一个Session会话对象,调用run方法,运行…

利用AI大模型实现个性化视频配音

最近,作者决定拍摄短视频分享AI技术的应用,并遇到了配音问题。由于家中环境嘈杂且设备不够专业,作者尝试了机器配音,但效果不佳。作者转而想到AI大模型支持语音识别,于是开始寻找语音合成模型。最终在阿里云百炼平台上找到了通义千问-语音合成CosyVoice大模型,多个音色都…