本篇文章将通过构建一个简单的实时聊天应用,演示如何在前端和后端搭建 WebSocket 系统,完成实时消息传输。通过实战,帮助你更好地理解 WebSocket 在实际项目中的应用。


目录

  1. 搭建 WebSocket 服务器
  2. WebSocket 客户端实现
  3. 实时聊天应用示例
  4. 常见问题与解决方案
  5. 小结

搭建 WebSocket 服务器

首先,我们需要搭建一个 WebSocket 服务器。这里我们使用 Node.js 和 ws 库来搭建服务器。ws 是一个常用的 WebSocket 实现,支持高效的双向通信。

1. 安装 ws

在项目中安装 ws 库:

npm install ws

2. 创建 WebSocket 服务器

接下来,我们编写一个简单的 WebSocket 服务器,处理客户端的连接和消息。

// websocket-server.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });// 当有客户端连接时
wss.on('connection', (ws) => {console.log('客户端已连接');// 当接收到客户端消息时ws.on('message', (message) => {console.log('收到消息: ', message);// 将消息发送给所有连接的客户端wss.clients.forEach((client) => {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});// 连接关闭时ws.on('close', () => {console.log('客户端断开连接');});
});console.log('WebSocket 服务器启动,监听 8080 端口...');

在上面的代码中:

  • 我们创建了一个 WebSocket 服务器,监听 8080 端口。
  • 当客户端连接时,会触发 connection 事件。
  • 当服务器接收到客户端发送的消息时,它会广播该消息给所有其他已连接的客户端。
  • wss.clients.forEach 用来遍历所有连接的客户端并发送消息。

3. 启动 WebSocket 服务器

运行服务器:

node websocket-server.js

启动成功终端会出现以下字样:

WebSocket 服务器启动,监听 8080 端口...

服务器启动后,就可以通过 WebSocket 客户端与其建立连接了。


WebSocket 客户端实现

接下来,我们在前端实现 WebSocket 客户端。我们将使用原生 JavaScript 来连接 WebSocket 服务器,并实现消息的发送与接收。

1. 创建 HTML 页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天应用</title><style>#messages { height: 300px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; }input, button { width: 100%; padding: 10px; margin-top: 10px; }</style>
</head>
<body><h2>WebSocket 聊天应用</h2><div id="messages"></div><input type="text" id="messageInput" placeholder="输入消息..."><button id="sendMessageBtn">发送</button><script> ... </script>
</body>
</html>
<script>const socket = new WebSocket('ws://localhost:8080'); // 连接 WebSocket 服务器const messagesDiv = document.getElementById('messages');const messageInput = document.getElementById('messageInput');const sendMessageBtn = document.getElementById('sendMessageBtn');// 当 WebSocket 连接成功时socket.onopen = function() {console.log('WebSocket 连接已建立');};// 当接收到服务器的消息时socket.onmessage = function (event) {// 检查数据类型是否为Blobif (event.data instanceof Blob) {// 将Blob转换为文本const reader = new FileReader();reader.onload = function () {const message = reader.result;displayMessage(message);};reader.readAsText(event.data);} else {// 如果是文本直接使用const message = event.data;displayMessage(message);}};// 单独的消息显示函数function displayMessage(message) {const messageElement = document.createElement('div');messageElement.textContent = message;messagesDiv.appendChild(messageElement);messagesDiv.scrollTop = messagesDiv.scrollHeight; // 滚动到最新消息}// 当 WebSocket 出现错误时socket.onerror = function(error) {console.log('WebSocket 错误: ', error);};// 当 WebSocket 连接关闭时socket.onclose = function() {console.log('WebSocket 连接已关闭');};// 点击发送按钮时发送消息sendMessageBtn.onclick = function() {const message = messageInput.value;if (message) {socket.send(message);messageInput.value = ''; // 清空输入框}};</script>

在这个 HTML 页面中:

  • 我们创建了一个简单的聊天界面,包含一个用于显示消息的 div 和一个输入框与按钮,用于输入和发送消息。
  • 使用 WebSocket 对象与后端 WebSocket 服务器建立连接,并在 onmessage 事件中接收消息并展示。
  • 点击“发送”按钮时,输入的消息将通过 WebSocket 发送到服务器。

2. 测试客户端与服务器

打开浏览器,打开这个 HTML 页面,打开多个标签页,可以看到多个客户端可以实时接收到其他客户端发送的消息。
在这里插入图片描述
从打开两个网页客户端相互发消息到关闭页面,在终端会显示以下内容:

客户端已连接
客户端已连接
收到消息:  <Buffer e4 bd a0 e5 a5 bd ef bc 81 e4 bb 8a e5 a4 a9 e6 98 9f e6 9c 9f e5 87 a0 ef bc 9f>
收到消息:  <Buffer e4 bd a0 e5 a5 bd ef bc 8c e4 bb 8a e5 a4 a9 e6 98 9f e6 9c 9f e4 b8 80 e3 80 82>
客户端断开连接
客户端断开连接

实时聊天应用示例

通过上面的代码,您已经完成了一个简单的实时聊天应用。每当一个客户端发送消息时,其他所有客户端都能立刻收到这条消息。这就是 WebSocket 的魅力所在——它为实时通信提供了便捷、低延迟的解决方案。

通过这个简单的聊天应用,我们实现了:

  • 消息的发送与接收:客户端可以发送消息,服务器将其广播给其他客户端。
  • 实时更新:消息的接收是即时的,确保了实时的沟通效果。

常见问题与解决方案

  1. 无法连接 WebSocket 服务器
    • 确保服务器正在运行,并且监听正确的端口。
    • 确认客户端使用的 WebSocket URL 正确,例如 ws://localhost:8080
  2. 消息不接收
    • 检查 WebSocket 连接是否成功(查看浏览器控制台中的 onopenonmessage 输出)。
    • 确认消息是否通过 socket.send() 正确发送。
  3. WebSocket 连接断开
    • 确保 WebSocket 连接没有被防火墙或代理阻止。
    • 使用 onclose 事件监听连接关闭,并实现重连机制。

小结

  1. 本篇文章通过一个简单的实时聊天应用,展示了如何在前端和后端使用 WebSocket 实现实时消息传输。
  2. 通过搭建 WebSocket 服务器和客户端,我们实现了一个简单的聊天系统,数据可以实时传输到多个客户端。
  3. WebSocket 为实时应用提供了高效的解决方案,适用于聊天、游戏、实时推送等场景。

🔔 下一篇文章,我们将进入 WebSocket 的性能优化,讲解如何提高 WebSocket 在高并发下的性能和稳定性。

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

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

相关文章

CentOS 8-BClinux8.2更换为阿里云镜像源:保姆级教程

还在为 CentOS 8 官方源访问缓慢或不可用而烦恼吗&#xff1f;更换为国内镜像源&#xff0c;如阿里云&#xff0c;可以显著提升软件包下载速度和稳定性。本文将带你一步步完成 CentOS 8 镜像源的更换&#xff0c;让你的系统管理更顺畅。 准备工作 在进行任何系统配置更改之前…

MySQL中InnoDB索引使用与底层原理

MySQL Server端的缓存&#xff08;查询缓存&#xff09;是MySQL Server层的特性&#xff0c;而InnoDB的缓存&#xff08;缓冲池&#xff09;是InnoDB存储引擎层的特性。两者是完全独立的。下面我们来深入探讨这两者以及InnoDB索引的原理。1. MySQL Server层的缓存 - 查询缓存 (…

Python实战:实现监测抖音主播是否开播并录屏

实现这个功能,主要思路是循环检查主播状态 → 开播后获取直播流地址 → 使用FFmpeg录制。下面是一个基本的步骤表格: 步骤 关键行动 常用工具/库 1 获取主播直播间ID或唯一标识 浏览器开发者工具、抓包工具1 2 循环请求抖音API,查询主播直播状态 requests, time 3 解析API响…

init / record / required:让 C# 对象一次成型

标签&#xff1a; init record required with表达式 不可变性 数据模型 DTO 目录1. init 访问器&#xff1a;让不可变对象的创建更灵活1.1. 概念1.1.1. 语法1.1.2. 语义1.2. 设计初衷&#xff1a;解决什么问题&#xff1f;1.3. 使用方法1.3.1. 在对象初始化器中赋值&#xff08…

每天五分钟深度学习:神经网络的权重参数如何初始化

本文重点 在逻辑回归的时候,我们可以将神经网络的权重参数初始化为0(或者同样的值),但是如果我们将神经网络的权重参数初始化为0就会出问题,上节课程我们已经进行了简单的解释,那么既然初始化为0不行,神经网络该如何进行参数初始化呢?神经网络的权重参数初始化是模型训…

[论文阅读] 告别“数量为王”:双轨道会议模型+LS,破解AI时代学术交流困局

告别“数量为王”&#xff1a;双轨道会议模型LS&#xff0c;破解AI时代学术交流困局 论文信息信息类别具体内容论文原标题From Passive to Participatory: How Liberating Structures Can Revolutionize Our Conferences主要作者及机构1. Daniel Russo&#xff08;丹麦奥尔堡大…

趣味学solana(介绍)

你就是那个关键的“守门员”&#xff01; 为了方便理解Solana&#xff0c;我们把Solana 想象成一个巨大的、24小时不停歇的足球联赛。成千上万的足球运动员&#xff08;用户&#xff09;在不停地传球、射门&#xff08;发送交易&#xff09;&#xff0c;而整个比赛的结果必须被…

分布式事务性能优化:从故障现场到方案落地的实战手记(三)

第三部分&#xff1a;混合场景攻坚——从“单点优化”到“系统协同” 有些性能问题并非单一原因导致&#xff0c;而是锁竞争与事务耗时共同作用的结果。以下2个案例&#xff0c;展示综合性优化策略。 案例7&#xff1a;基金申购的“TCC性能陷阱”——从全量预留到增量确认 故障…

规则系统架构风格

考题 某公司拟开发一个VIP管理系统,系统需要根据不同商场活动,不定期更新VIP会员的审核标准和VIP折扣系统。针对上述需求,采用(__)架构风格最为合适。 A. 规则系统 B. 管道-过滤器风格 C. 事件驱动 D. 分层 一、什么是规则系统架构风格? 规则系统架构风格是一种将应…

kubeadm搭建生产环境的单master多node的k8s集群

k8s环境规划: podSubnet&#xff08;pod 网段&#xff09; 10.20.0.0/16 serviceSubnet&#xff08;service 网段&#xff09;: 10.10.0.0/16 实验环境规划: 操作系统&#xff1a;centos7.9 配置&#xff1a; 4G 内存/4核CPU/40G 硬盘 网络&#xff1a;NAT K8s集群角色ip主…

React Device Detect 完全指南:构建响应式跨设备应用的最佳实践

前言 在现代 Web 开发中&#xff0c;设备检测是一个至关重要的功能。不同的设备&#xff08;手机、平板、桌面&#xff09;有着不同的屏幕尺寸、交互方式和性能特点&#xff0c;因此需要针对性地提供不同的用户体验。react-device-detect 是一个专门为 React 应用设计的设备检…

Spark专题-第一部分:Spark 核心概述(2)-Spark 应用核心组件剖析

这一篇依然是偏理论向的内容&#xff0c;用两篇理论搭建起Spark的框架&#xff0c;让读者有个基础的认知&#xff0c;下一篇就可以开始sql的内容了 第一部分&#xff1a;Spark 核心概述&#xff08;2&#xff09; Spark 应用核心组件剖析 1. Job, Stage, Task 的三层架构 理解 …

KMP 字符串hash算法

kmp算法 最大相同真前后缀&#xff1a; 如 ababa的最大真前后缀为aba&#xff0c; 而不是ababa&#xff08;真前后缀与真子集类似&#xff0c;不可是本身&#xff0c;不然没意义&#xff09; 所以next[1] 0&#xff1b;//string的下标从1开始 kmp模拟 next初始化&#xff…

HOT100--Day22--74. 搜索二维矩阵,34. 在排序数组中查找元素的第一个和最后一个位置,33. 搜索旋转排序数组

HOT100–Day22–74. 搜索二维矩阵&#xff0c;34. 在排序数组中查找元素的第一个和最后一个位置&#xff0c;33. 搜索旋转排序数组 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;二分查找。 关键&#xff1a; 今天的题目都是“多次二分” 74题&#xf…

Java分布式锁实战指南:从理论到实践

Java分布式锁实战指南&#xff1a;从理论到实践 前言 在分布式系统中&#xff0c;传统的单机锁机制无法满足跨进程、跨机器的同步需求。分布式锁应运而生&#xff0c;成为保证分布式系统数据一致性的关键技术。本文将全面介绍Java中分布式锁的实现方式和最佳实践。 1. 分布式锁…

(二叉树) 本节目标 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习

二叉树1. 树型结构&#xff08;了解&#xff09;1.1 概念1.2 概念&#xff08;重要&#xff09;1.3 树的表示形式&#xff08;了解&#xff09;1.4 树的应用2. 二叉树&#xff08;重点&#xff09;2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基…

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

文章目录前言一、PMU系统介绍二、Zephyr系统下驱动PMU的组成2.1&#xff1a;PMU系统在Zephyr上包括五大部分&#xff1a;2.2&#xff1a;功能说明2.3&#xff1a;B-core功能说明(Freertos)三、PMU各驱动API详解3.1:Power_domain3.1.1&#xff1a;初始化3.1.2&#xff1a;rpmsg回…

华清远见25072班网络编程学习day5

作业0> 将IO多路复用实现TCP并发服务器实现一遍程序源码&#xff1a;#include <25072head.h> #define SER_IP "192.168.153.128" //服务器ip地址 #define SER_PORT 8888 //服务器端口号 int main(int argc, const char *argv[]) {//1、创建一个…

【数据结构--顺序表】

顺序表和链表 1.线性表&#xff1a; 线性表是n个具有相同特性&#xff08;相同逻辑结构&#xff0c;物理结构&#xff09;的数据元素的有限序列。常见的线性表有&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;字符串…线性表在逻辑上是线性结构…

【PyTorch】图像多分类部署

如果需要在独立于训练脚本的新脚本中部署模型&#xff0c;这种情况模型和权重在内存中不存在&#xff0c;因此需要构造一个模型类的对象&#xff0c;然后将存储的权重加载到模型中。加载模型参数&#xff0c;验证模型的性能&#xff0c;并在测试数据集上部署模型from torch imp…