nodejs的ws+vue3编写聊天室的demo

news2024/11/16 17:41:07

nodejs编写ws服务是非常简单高效的,nodejs有众多的实现ws的库,如ws,SocketIO等,nodejs的事件线程是单线程的,所以不要在事件线程内做阻塞性的操作,耗时的操作交给工作线程或者子进程操作。

我使用nodejs+vue3实现了写了个简单的聊天室demo

1.nodejs服务端代码

node init初始化项目
安装ts
具体可以看我nodejs 使用ts的文章
安装ws的库

npm install ws
npm install @types/ws
import {WebSocketServer,WebSocket} from 'ws';

const wss = new WebSocketServer( {port:3000});

wss.on('connection',(ws)=>{
    console.info('new connection join',ws);
    ws.on('message',(data)=>{

        wss.clients.forEach((client=>{
            if (client.readyState === WebSocket.OPEN) {
                client.send(data,{binary:false});
              }
        }))

        console.info('get msg from client',(new String(data)).toString());
    })
 
});

console.log('start success');

在这里插入图片描述

2. vue3连接客户端

使用游览器自带的WebSocket对象连接ws服务,使用ws库的WebSocket对象在游览器运行时会报错,存在一定的问题,

<script setup lang="ts">
import { onMounted, ref } from "vue"
import { Msg } from "@/model"

const props=defineProps<{
  username: string
}>();

const toSendMsg = ref("");

const username=props.username;

const receiveMsgList = ref<Msg[]>([])

const ws = new WebSocket('ws://localhost:3000');

onMounted(() => {
  // WebSocket 服务器的 URL
  const wsUrl = 'ws://localhost:3000';

// 创建 WebSocket 连接
const ws = new WebSocket(wsUrl);

// 监听连接成功事件
ws.addEventListener('open', function () {
  console.log('Connected to WebSocket server');

  // 发送消息给服务器
});

// 监听接收到消息事件
ws.addEventListener('message', function (event) {
  
  console.log('Blob content as string:', event.data);
  receiveMsgList.value.push(JSON.parse(event.data))

});

// 监听连接关闭事件
ws.addEventListener('close', function () {
  console.log('Disconnected from WebSocket server');
});

// 监听连接错误事件
ws.addEventListener('error', function (error) {
  console.error('WebSocket error:', error);
});
})

function sendMsg(){
  const msgInfo= new Msg(username,toSendMsg.value)
  ws.send(JSON.stringify(msgInfo));
  toSendMsg.value="";
}

</script>

<template>
  <el-col :span="6">
    <div class="chart-out-box">
      <div class="chart-room-head">
        <el-scrollbar height="400px">
          <div v-for="(item, index) in receiveMsgList" :key="index">
            <p v-if="item.username == username" class="scrollbar-demo-item scrollbar-demo-is-own">


              {{item.content}}<span>{{ ":"+username }}</span>
              </p>
              <p v-else class="scrollbar-demo-item scrollbar-demo-is-other">

<span>{{item.username}}:</span>{{ item.content }}</p>
          </div>
          
        </el-scrollbar>
      </div>
      <div class="chart-room-footer">
        <el-input v-model="toSendMsg" style="width: 240px" :rows="4" type="textarea" placeholder="Please input" />
        <el-button type="success" style="margin-left:20px" @click="sendMsg">发送</el-button>
      </div>
    </div>
  </el-col>

</template>

<style lang="scss" scoped>
.chart-out-box {
  border: 1px solid blue;
  height: 400px;
}

.chart-room-head {
  height: 70%;
  border: 1px solid green;
  ;
}

.chart-room-footer {}

.scrollbar-demo-item {
  display: flex;
  align-items: center;
  height: 50px;
  margin: 10px;
  text-align: center;
  border-radius: 4px;
  background: var(--el-color-primary-light-9);
  color: var(--el-color-primary);
}

.scrollbar-demo-is-own {
  justify-content: right;
}

.scrollbar-demo-is-other {
  justify-content: left;
}

</style>

3.演示

在这里插入图片描述

4.git代码

https://github.com/haozhi-ly/chatroom-demo

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量&#xff08;只读变量&#xff09; // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化&#xff0c;否则会报错 const MY_AGE /…

MySQL —— 表的基本操作

一、创建 1.语法 create table 表名称( 自定义变量1, 自定义变量2, 自定义变量3&#xff08;最后一个变量末尾不需要加任何标点符号&#xff09; )charset字符集 collate校验集 engine存储引擎; ps&#xff1a;若是不具体给字符集、校验集、储存引擎&#xff0c;则采用配置文件…

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…

计算机网络——Dijkstra路由算法

实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间&#xff0c;然后给点映射数字&#xff0c;构建图。程序获取用户输入的学号&#xff0c;构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点&#xff0…

prometheus+grafana的安装与部署及优点

一、Prometheus 的优点 1、非常少的外部依赖&#xff0c;安装使用超简单&#xff1b; 2、已经有非常多的系统集成 例如&#xff1a;docker HAProxy Nginx JMX等等&#xff1b; 3、服务自动化发现&#xff1b; 4、直接集成到代码&#xff1b; 5、设计思想是按照分布式、微服…

QT Windows 实现调用Windows API获取ARP 表

简介 使用ping方式获取网络可访问或者存在的设备发现部分会无法ping通但实际网络上存在此设备&#xff0c; 但使用arp -a却可以显示出来&#xff0c; 所以现在使用windows API的方式获取arp 表。 实现 参考Windows提供的示例转化成Qt Qt .pro LIBS -liphlpapiLIBS -lws2_32…

分割链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* partition(struct ListNode* head, int x){if(head NULL){return head;}//创建新链表ListNode* lessHead,*…

UE5(射线检测)学习笔记

这一篇会讲解射线检测点击事件、离开悬停、进入悬停事件的检测&#xff0c;以及关闭射线检测的事件&#xff0c;和射线检测蓝图的基础讲解。 创建一个简单的第三人称模板 创建一个射线检测的文件夹RadiationInspection&#xff0c;并且右键蓝图-场景组件-命名为BPC_Radiation…

用于密集预测任务的通道知识蒸馏——关键字:蒸馏

摘要 https://arxiv.org/pdf/2011.13256 知识蒸馏(KD)已被证明是训练紧凑密集预测模型的简单有效工具。通过从大型教师网络转移而来的额外监督来训练轻量级学生网络。大多数先前的针对密集预测任务的KD变体都在空间域中对学生网络和教师网络的激活图进行对齐,通常是通过在每…

pandas读取文件导致jupyter内核崩溃如何解决

读取execl文件出现以下问题: str_name "D:\\cao_use\\2017_2021(new).xlsx" train_df pd.read_excel(str_name, usecols[0])崩溃的指示图如下所示: bug原因:读入的文件太大&#xff0c;所需时间过长&#xff0c;在读取的过程中&#xff0c;使用中断按钮暂停会直…

C语言实战项目--贪吃蛇

贪吃蛇是久负盛名的游戏之一&#xff0c;它也和俄罗斯⽅块&#xff0c;扫雷等游戏位列经典游戏的行列。在编程语言的教学中&#xff0c;我们以贪吃蛇为例&#xff0c;从设计到代码实现来提升大家的编程能⼒和逻辑能⼒。 在本篇讲解中&#xff0c;我们会看到很多陌生的知识&…

13_Scala面向对象编程_伴生对象

文章目录 1.伴生对象1.1 scala的一个性质&#xff0c;scala文件中的类都是公共的&#xff1b;1.2 scala使用object关键字也可以声明对象&#xff1b; 3.关于伴生对象和类4.权限修饰符&#xff0c;scala仅有private;5.伴生对象可以访问伴生类中的私有属性&#xff1b;6.案例7.伴…

AI预测福彩3D第10套算法实战化赚米验证第1弹2024年5月5日第1次测试

从今天开始&#xff0c;准备启用第10套算法&#xff0c;来验证下本算法的可行性。因为本算法通过近三十期的内测&#xff08;内测版没有公开预测结果&#xff09;&#xff0c;发现本算法的预测结果优于其他所有算法的效果。彩票预测只有实战才能检验是否有效&#xff0c;只有真…

【论文阅读】Sparse is Enough in Scaling Transformers

Sparse is Enough in Scaling Transformers 论文地址摘要1 介绍2 相关工作模型压缩。模型修剪模型蒸馏。稀疏注意力。张量分解。稀疏前馈。 3 Sparse is Enough3.1 稀疏前馈层3.2 稀疏 QKV 层3.3 稀疏损失层。 4 长序列的稀疏性4.1 长序列架构4.2 内存效率的可逆性4.3 泛化的循…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

Webshell绕过技巧分析之-base64/HEX/Reverse/Html/Inflate/Rot13

在网络安全运营&#xff0c;护网HVV&#xff0c;重保等活动的过程中&#xff0c;webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现&#xff0c;而是针对webshell关键的内容进行混淆&#xff0c;编码来绕过网络安全产品&#xff08;IDS&#xff0c;WAF&…

【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 一、所需公式 1、自由空间中电子的波函数公式&#xff1a; 2、常量代换&#xff1a; 3、物理常量&#xff1a; 二、Python代码&#xff1a; …

PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写 PostgreSQL 查询计划openGauss 查询计划拓展对比 看腻了文章就来听听视频讲解吧&#xff1a;https://www.bilibili.com/video/BV1oH4y137P7/ 数据库类型数据库版本PostgreSQL16.2openGauss6.0 创建测试表…

【Java基础】成员变量和局部变量的区别

成员变量vs局部变量 局部变量没有默认值 成员变量有默认值局部变量在栈中开辟内存 成员变量在堆中开辟内存局部变量是当其所在的函数被调用时开辟内存 成员变量是创建对象时开辟内存局部变量是当其作用域结束时立刻释放内存 成员变量是当其所属的对象成为垃圾时等待垃圾回收线…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…