极简websocket实时聊天

基于WebSocket的极简实时聊天应用架构设计与实现 实时通信是现代Web应用的核心能力之一,其本质在于实现客户端与服务器之间的低延迟、双向数据同步。从技术原理上看,早期基于HTTP的轮询(Polling)和长轮询(Long Polling)方案存在延迟高、资源消耗大的固有缺陷。WebSocket协议的出现,通过在单个TCP连接上提供全双工通信通道,从根本上解决了这些问题,为实时应用提供了高效、稳定的技术基础。其技术价值在于能够显著降低服务器负载、减少通信延迟,并简化客户端编程模型。这一特性使其在在线聊天、协同编辑、实时通知和在线游戏等场景中成为首选方案。本文 阅读详情

在线体验链接:http://47.242.53.5:888/

项目git地址:https://gitee.com/xiao-ming-1999/websocket-server.git

实现步骤:

  1. 在前端创建WebSocket连接:在Vue组件中使用vue-native-websocket库或原生的WebSocket API来创建WebSocket连接。确保连接到服务器的WebSocket地址和端口。

  2. 在前端发送消息:在Vue组件中通过WebSocket连接发送用户输入的消息到服务器。可以通过表单提交、按钮点击等方式触发发送操作,并使用WebSocket的send方法将消息发送给服务器。

  3. 在后端处理WebSocket连接:在服务器端使用Node.js和Express或其他后端框架来处理WebSocket连接请求,并维护连接状态。

  4. 在后端接收和广播消息:在服务器端监听WebSocket连接的message事件,当接收到一条新消息时,将其广播给所有连接的客户端。

  5. 在前端接收和显示消息:在Vue组件中监听WebSocket的message事件,当接收到新消息时,在页面上更新聊天消息列表或对话框。

前端代码:

<template>
  <div class="chat-box">
    <h2>websocket-chat</h2>
    <ul>
      <li
        v-for="(message, index) in messages"
        :key="index"
        :style="{ background: '#' + message.bgColor }"
        class="message-item"
      >
        <p>{{ message.sender }}:{{ message.text }}</p>
      </li>
    </ul>

    <div class="chat-btn">
      <van-field
        v-model="newMessage"
        center
        clearable
        placeholder="请随意输入信息"
        @keydown.enter="sendMessage"
      >
        <template #button>
          <van-button type="primary" @click="sendMessage">发送</van-button>
        </template>
      </van-field>
    </div>
  </div>
</template>

<script>
const randomColor = Math.floor(Math.random() * 16777215).toString(16);
// const randomColor2 = Math.floor(Math.random() * 16777215).toString(16);
export default {
  name: "clockIn",
  data() {
    return {
      messages: [],
      newMessage: "",
      userId: Date.now(),
      randColor: randomColor,
    };
  },
  mounted() {
    // 监听WebSocket的message事件,当接收到新消息时,在页面上更新聊天消息列表或对话框。
    this.$socket.onmessage = (event) => {
      const message = JSON.parse(event.data);
      this.messages.push(message);
      console.log(this.messages, "this.messages");
    };

    this.$socket.onopen = () => {
      this.$socket.send(JSON.stringify({ action: "getUserId" }));
    };
  },
  methods: {
    sendMessage() {
      const message = {
        id: this.userId,
        text: this.newMessage,
        bgColor: this.randColor,
      };
      // this.messages.push(this.newMessage);
      this.$socket.send(JSON.stringify(message));
      this.newMessage = "";
    },
  },
};
</script>
<style lang="scss" scoped>
.chat-box {
  height: 100vh;
  overflow-y: auto;
  padding: 50px 0;

  h2 {
    position: fixed;
    top: 0;
    background-color: #07c160;
    font-weight: 700;
    text-align: center;
    width: 100%;
    height: 50px;
    line-height: 50px;
    color: #fff;
  }
}

.chat-btn {
  width: 100%;
  height: 50px;
  position: fixed;
  bottom: 0;
  display: flex;
  justify-content: space-between;
  align-items: center;

  ::v-deep .van-cell {
    padding-right: 0;
  }
}

.message-item {
  width: 100%;
  // height: 40px;
  // line-height: 40px;

  // white-space: pre-wrap;
}
</style>

 后端代码

const express = require("express");
const WebSocket = require("ws");

const app = express();

app.get("/", (req, res) => {
  res.send("Hello, World!"); // 发送响应给客户端
});

const server = app.listen(3008, () => {
  console.log("Server is running on http://47.242.53.5:3008");
});

const wss = new WebSocket.Server({ server });
const clients = [];

wss.on("connection", (ws) => {
  // 服务器端监听WebSocket连接的message事件,当接收到一条新消息时,将其广播给所有连接的客户端。
  ws.on("message", (message) => {
    const parsedMessage = JSON.parse(message);
    console.log(message, "message");
    if (parsedMessage.action === "getUserId") {
      ws.userId = generateUserId(); // 分配用户标识符
      //   ws.send(JSON.stringify({ userId: ws.userId }));
      return;
    }

    parsedMessage.sender = ws.userId;
    const broadcastMessage = JSON.stringify(parsedMessage);
    // 广播消息给所有连接的客户端
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(broadcastMessage);
      }
    });
  });

  ws.on("close", () => {
    // 移除关闭的客户端连接
    clients.splice(clients.indexOf(ws), 1);
  });
});
// 生成用户昵称
function generateUserId() {
  return Math.random().toString(36).substr(2, 9);
}

从零构建极简实时聊天应用:WebSocket与Socket.IO实战指南 实时通信是现代Web应用的核心能力之一,其底层依赖于WebSocket协议,该协议在单个TCP连接上提供全双工通信通道,克服了HTTP协议在实时性上的不足。从技术原理上看,WebSocket通过一次HTTP握手升级协议,之后便允许服务器主动向客户端推送数据,这为聊天、通知、协同编辑等场景提供了技术基础。其技术价值在于能够显著降低延迟、减少不必要的网络开销,并简化了实时应用的开发模型。在实际工程实践中,开发者常使用Socket.IO库,它在原生WebSocket之上封装了自动重连、心跳检测、回退机制等生产级特 阅读详情

相关推荐

从零构建极简实时聊天应用:React、Node.js与WebSocket实战

实时通信是现代Web应用的核心能力之一,其基础原理在于建立客户端与服务器之间的持久、双向连接,以支持数据的即时推送与同步。WebSocket协议是实现这一目标的关键技术,它突破了传统HTTP请求-响应模式的限制,为在线聊天、协同编辑、实时通知等场景提供了高效的技术方案。在工程实践中,结合React等前端框架的组件化开发与状态管理,以及Node.js后端的事件驱动模型,开发者能够构建出高性能、可维护的实时应用。本文以“极简主义聊天应用”为具体案例,深入剖析了如何运用WebSocket、React状态管理(如C

weixin_26750831的博客 305

基于WebSocket实现实时聊天

WebSocket是一种基于TCP协议的全双工通信协议,它通过一个初始的握手过程建立连接,然后保持连接开放,双方可以随时向对方发送消息。这与传统的HTTP通信不同,HTTP通信需要客户端发起请求,服务器响应后连接就会关闭,而WebSocket则支持双向通信,允许服务器主动向客户端推送数据。

weixin_56694018的博客 517

go语言实现实时聊天系统 (附完整源码)

本文介绍了使用Go语言实现的简易实时聊天系统。服务端基于gorilla/websocket库,实现WebSocket连接管理、消息广播功能;前端采用HTML+JS,提供简单的聊天界面。系统支持多客户端实时通信,用户可输入用户名和消息进行交互。文章提供了完整的代码实现,包括服务端消息处理逻辑和前端WebSocket连接代码,并说明了如何运行该系统。该实现适合学习WebSocket通信原理或小范围局域网使用,但未包含生产环境所需的安全和稳定性功能。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 739

集成websocket实现实时通信(ruoyi 使用笔记)

Websocket 是一种基于 TCP 协议的全双工通信协议,它使得客户端和服务器之间可以进行实时的双向通信。相对于传统的 HTTP 协议只能通过客户端发送请求,然后等待服务端的响应,WebSocket 可以让客户端和服务器在任何时候都可以相互发送消息,这种实时通信的方式非常适合需要实时更新数据的应用场景,比如聊天室、在线游戏、股票行情等。客户端向服务器发起 WebSocket 握手请求;服务器返回确认信息给客户端,完成握手;握手成功后,客户端和服务器就可以通信了;

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

多尺度变换(Multidimensional Scaling ,MDS)详解

介绍多尺度变换基本原理

5215

Android11 关于三方应用获取su权限

SELinux,全称Security-Enhanced Linux,是一种基于Linux内核的安全机制。它通过强制访问控制(MAC)来增强Linux系统的安全性,如果不禁用SELinux,完成下面的修改可能会导致设备进入Recovery界面!adb shell getenforce 为Permissive(宽容模式),查看报错日志,发现是客户apk想使用su命令提权,但是没有权限!对于保护系统资源和防止未经授权访问非常有帮助!系统这边做修改,让su权限下放到三方应用.客户的apk运行报错。

sinat_37429535的博客 1901

前端(二十一)——WebSocket:实现实时双向数据传输的Web通信协议

在当今互联网时代,实时通信已成为很多应用的需求。为了满足这种需求,WebSocket协议被设计出来。WebSocket是一种基于TCP议的全双工通信协议,通过WebSocket,Web应用程序可以与服务器建立持久的连接,实现实时双向数据输,提供极低的延迟和高效的数据传输。

杜永康的博客 1万+

易灵思Ti60F100 FPGA的HyperRAM实战:从硬件连接到Native接口时序调试

本文详细介绍了易灵思Ti60F100 FPGA内置HyperRAM控制器的实战应用。文章从硬件设计要点(如400MHz+信号完整性、等长匹配)切入,重点解析了如何通过Interface Designer配置高效的Native接口,并分享了其时序详解与调试技巧,为开发者提供了一份从硬件连接到软件调试的深度指南。

weixin_29168153的博客 454

深入浅出FE(十四)深入浅出websocket

引言 Websocket是一个持久化的协议 协议分为ws(80端口)协议 和wss(443端口)协议。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久

前端产品工程师 1098

Python+OpenCV实现游戏自动刷怪脚本(附完整代码)

本文详细介绍了如何使用Python和OpenCV开发游戏自动刷怪脚本,涵盖环境搭建、图像识别、行为决策引擎及反检测优化等关键技术。通过完整的代码示例,帮助开发者实现从简单脚本到智能自动化系统的升级,提升游戏效率。

weixin_29032489的博客 517

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 444

vue2 封装 webSocket 开箱即用(或 uni.connectSocket)

开箱即用 封装 webSocket。

qq_44161703的博客 2336

告别双系统!用Ventoy把Ubuntu 22.04装进U盘,打造你的随身开发环境(附保姆级避坑指南)

本文详细介绍了如何使用Ventoy将Ubuntu 22.04安装到U盘,打造便携式开发环境。通过即插即用的特性,开发者可以在任何x86电脑上快速启动完整的Ubuntu系统,无需配置双系统或虚拟机。文章提供了从硬件准备到系统优化的全流程指南,帮助用户高效创建随身开发环境。

weixin_31569671的博客 364

极简聊天室-websocket版(双向通信)

我们知道WebSocket是可以双向通信的,把极简聊天室代码又改了一下,前端发信息到后端也使用websocket,其实代码量更少了。效果跟前面一样,就不再贴图了。

dgiij的博客 616

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细解析了企业微信群机器人的Webhook配置全流程,从创建机器人、获取关键Webhook地址,到使用代码发送文本、Markdown等多种消息类型。内容涵盖安全加固、错误处理及与CI/CD等系统集成的实战指南,帮助企业快速构建高效、稳定的内部通知系统。

ik678901的博客 1782

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2994

springboot集成websocket实现聊天室(极简版)

springboot 集成 websocket 聊天室【极简版】

weixin_49823868的博客 1118

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AnyChat极简WebSocket聊天插件:5分钟快速嵌入任何系统的完整指南

AnyChat是一款极简纯净的WebSocket聊天插件,专为需要快速集成实时通讯功能的系统设计。只需提供三个API即可对接任何身份系统,支持个人聊天、群聊、上下线状态同步、聊天记录查看及离线消息推送等核心功能,让你轻松拥有服务器绝对控制权的推送机制和高效的线程设计。 ## 🚀 为什么选择AnyChat?三大核心优势解析 ### 1️⃣ 极速嵌入,开发成本近乎为零 AnyChat采用插件化设

gitblog_01130的博客 994

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Melody:一个极简的WebSocket框架

Melody 是一个基于 Go 语言开发的极简 WebSocket 框架。它构建在 `github.com/gorilla/websocket` 之上,旨在简化 WebSocket 的开发流程,让开发者能够更专注于实时应用的逻辑实现。Melody 的设计理念是提供一个清晰、易用的接口,类似于 `net/http` 或 Gin 框架,使得开发者可以快速上手并构建高效的实时应用。 ## 项目核心功能...

gitblog_00569的博客 427

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

推荐一款强大的 Svelte 实时数据交互组件库 —— svelte-websocket-store

???? 推荐一款强大的 Svelte 实时数据交互组件库 —— svelte-websocket-store svelte-websocket-storesvelte store with a websocket backend项目地址:https://gitcode.com/gh_mirrors/sv/svelte-websocket-store 在当今实时互联网应用的时代,实时数据通信变得至关重...

gitblog_00079的博客 452

Node.js 基于socket.io的简易聊天程序

1、简单释义 socket.io是一个跨浏览器支持WebSocket的实时通讯的JS。 Socket.io支持及时、双向、基于事件的交流,可在不同平台、浏览器、设备上工作,可靠性和速度稳定。最典型的应用场景如: 实时分析:将数据推送到客户端,客户端表现为实时计数器、图表、日志客户。 实时通讯:聊天应用 二进制流传输:socket.io支持任何形式的二进制文件传输,例如图片、视频、音频等。...

李小白的博客 769

轻松管理 WebSocket 连接!easy-websocket-client

在前端开发中,WebSocket 是实现实时通信的核心技术,但原生 WebSocket 的连接管理(如断连重连、心跳维护、事件监听)往往需要编写大量重复代码。今天给大家分享一个自己开发的——,帮你一站式解决连接管理难题,专注业务逻辑开发!

CbukeJ的博客 182

Node.js + Websocket实现多人聊天功能(不会被监测到)

背景。

qq_34798719的博客 181

在 GitLab CI/CD 中运行 Artillery 负载测试:完整实战指南

<output> # 在 GitLab CI/CD 中运行 Artillery 负载测试:完整实战指南 > **导读**:本文以 [examples/cicd/gitlab-ci-cd](https://link.gitcode.com/i/39a9a27b9255fbc801d76bfaab8d579a) 目录下的官方示例为主线,完整演示如何在 GitLab CI/CD 流水线中运行 [Ar

gitblog_00622的博客 320

Lune项目实战:构建高性能HTTP服务器和WebSocket应用的终极指南

Lune是一个独立的Luau运行时,专为构建高性能网络应用而设计。作为类似Node.js、Deno和Bun的运行时环境,Lune提供了完全异步的API,并且使用Rust语言构建,确保了卓越的速度、安全性和正确性。在本文中,我们将探索如何使用Lune轻松构建高性能的HTTP服务器和实时WebSocket应用,无需复杂的配置即可实现高效的网络通信。🚀 [![Lune高性能网络运行时](https:

gitblog_00566的博客 792

AnyChat嵌入式聊天解决方案:从零开始构建企业级即时通讯系统

AnyChat是一款极简纯净的WebSocket聊天插件,专为企业级应用设计,支持对接任何身份系统,嵌入方只需提供三个API即可实现实时通讯功能。它不仅支持个人聊天、群聊、上下线状态同步、聊天记录查询和离线消息推送,还采用服务器绝对控制权的推送机制和合理的线程设计,同时支持MongoDB存储聊天记录,天生具备嵌入式支持特性。 ## 为什么选择AnyChat?核心优势解析 🚀 AnyChat作

gitblog_00025的博客 660
上一篇: el高复用性组件封装
下一篇: 微信小程序踩坑记录
FF_XM
博客等级 码龄5年 19粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值