uni-app里使用webscoket

实现思路和vue中是一样的。如果想看思路可以看这篇文章:websocket

直接上可以运行的代码:

一、后端nodeJS代码:

1、新建项目文件夹

2、初始化项目:

npm init -y

3、项目里安装ws

npm i ws --save

4、nodeJS代码:

chat.js

const WsServer = require("ws").Server;

// 创建webscoket的服务器对象
const server = new WsServer({ port: 9000 });

// 绑定connection事件(当有浏览器端连接时,会触发)

let allClient = []; //保存着所有的客户端

server.on("connection", (client) => {
  console.log("有人连接了");
  // 保存连接的客户端
  allClient.push(client);
  console.log("allClient.length", allClient.length);

  // 给所有客户端发送人数:
  sendCount();

  // 给当前客户端对象绑定message事件(当前该客户端给服务器发送消息时,触发
  client.on("message", (str) => {
    console.log("有人发了消息",str);
    // 把收到的消息转发给其它客户端
    sendMsg(client,str);
  });

  client.on("close", () => {
    sendMsg(client,"有人退出了");
    allClient = allClient.filter((item) => item != client);
    sendCount();
  });
});
// 发送消息
function sendMsg(client,content) {
  allClient.forEach((item) => {
    if (item != client) {
      item.send(JSON.stringify({
        status: "msg",
        content,
      }));
    }
  });
}

// 发送人数
function sendCount() {
  allClient.forEach((item) => {
    item.send(JSON.stringify({
        status: "count",
        count: allClient.length,
      }));
  });
}

5、运行后端项目:

nodemon chat

二、前端uni-app代码

1、uni-app代码

<template>
	<view>
		<view>聊天:在线人数:{{count}}</view>
		<view class="chat-box" v-html="allmsg"></view>
		<input v-model="msg" />
		<button @click="sendMsg">发送</button>
		<button @click="exitChat">退出聊天</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				allmsg: "",
				msg: "",
				count: 0
			}
		},
		onLoad() {
			const socketTask = uni.connectSocket({
				url: "ws://127.0.0.1:9000/",
				success() {

				}
			});
			console.log("socketTask", socketTask);

			uni.onSocketOpen(() => {
				console.log("服务器已经打开链接");
				// ws.send("大家好,我是新来的");
				uni.sendSocketMessage({
					data: "大家好,我是通过uni来的"
				})
			})

			uni.onSocketMessage((res) => {
				console.log('收到服务器内容:' + res.data);
				// this.allmsg += `<view>${res.data}</view>`;

				const obj = JSON.parse(res.data);
				if (obj.status == "msg") {
					console.log("typeof obj.content", typeof obj.content);
					console.log("obj.content", obj.content);
					this.allmsg += `<view>${this.blobToStr(obj.content.data)}</view>`;
					
				} else if (obj.status === "count") {
					console.log("obj.count", obj.count);
					this.count = obj.count;
				}
			})
		},
		methods: {
			exitChat(){
				uni.closeSocket();
			},
			blobToStr(data) {
				var enc = new TextDecoder("utf-8");
				var arr = new Uint8Array(data);
				return enc.decode(arr)
			},
			sendMsg() {
				uni.sendSocketMessage({
					data: this.msg
				})
			}
		}
	}
</script>

<style scoped>
	.chat-box {
		width: 100%;
		height: 800rpx;
		border: 1px solid red;
	}
</style>

2、运行项目,界面如下:

解释:当打开前端页面时,后端的socket会自动连接上

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STL list基本用法

目录 list的使用构造函数和赋值重载迭代器(最重要)容量相关插入删除元素操作reversesortuniqueremovesplice list的底层实际是双向链表结构 list的使用 构造函数和赋值重载 构造函数说明list()无参构造list (size_type n, const value_type& val value_type())构造的li…

Python学习笔记_进阶篇(一)_浅析tornado web框架

tornado简介 1、tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架&#xff08;包括大多数 Python 的框架&#xff09;有着明显的区别&#xff1a;它是非阻塞式服务器&#xff0c;而且速度相当快。得利于…

Clock Domain Crossing(CDC)跨时钟域

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ​跨时钟域(CDC)指的是信号由一个时钟域进入另一个时钟域,以下图为例。 ● F1属于clk1时钟域 ● Q1属于clk1时钟域的信号 ● F2属于clk2时钟域 ● Q2属于clk2时钟域的信号 ● Q1对于F2来说是…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

数据结构(Java实现)-二叉树(下)

获取二叉树的高度 检测值为value的元素是否存在(前序遍历) 层序遍历 判断一棵树是不是完全二叉树 获取节点的路径 二叉树的最近公共祖先

c++的IO流

前言 很多编程语言都有自己的输入输出流&#xff0c;流是一种抽象的概念&#xff0c;为了方便我们使用各种输入输出设备从而抽象出来的概念。 目录 1.C语言的输入和输出 2.流的概念 3.CIO流 3.1C标准I/O流 3.2C文件I/O流 4.stringstream的简单介绍 1.C语言的输入和输出 在…

MIUI 欧版刷机教程(操作篇)

文章目录 0 前置条件1 下载ROM包2 确定刷机方式3 线刷教程4 卡刷教程使用系统更新使用 TWRP 问题汇总 0 前置条件 必须先解除手机的 bootloader 锁。详细教程参见官网&#xff1a;申请解锁小米手机 (miui.com)。 1 下载ROM包 在 MIUI EU 官方论坛&#xff08;需要科学上网&a…

css-选择器、常见样式、标签分类

CSS CSS简介 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可…

呈现数据的精妙之道:选择合适的可视化方法

在当今数据时代&#xff0c;数据可视化已成为理解和传达信息的重要手段。然而&#xff0c;选择适合的数据可视化方法对于有效地呈现数据至关重要。不同的数据和目标需要不同的可视化方法&#xff0c;下面我们将探讨如何选择最佳的数据可视化方法来呈现数据。 1. 理解数据类型&a…

蓝蓝设计-UI设计公司作品-博晖创新原子吸收光谱仪软件交互及界面设计

博晖创新原子吸收光谱仪软件交互及界面设计 图标设计 | 交互设计 | 界面设计 博晖公司拥有强大的自主研发实力&#xff0c;建立了专业的研发团队&#xff0c;通过不断的技术创新&#xff0c;形成了分子诊断、免疫诊断、原子吸收、原子荧光及质谱五大技术平台&#xff0c;并成功…

Vue中使用vue-drag-resize实现窗体可拖拽和随意缩放大小

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_ruoyi本地调式_霸道流氓气质的博客-CSDN博客 在上面的基础上&#xff0c;实现弹窗窗体可移动以及随意缩放大小。 效果如下 注&#xff1a; 博客&am…

【Go 基础篇】Go语言中的defer和recover:优雅处理错误

Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面&#xff0c;Go语言提供了一种优雅的机制&#xff0c;即通过defer和recover组合来处理恐慌&#xff08;panic&#xff09;错误。本文将详细介绍Go语言中的defer和recover机制&#xff0c;探讨其工作原理…

vue页面中想在input框用户输入的参数后加单位的方法

<el-form-item label"金重" prop"weight"><el-input v-model"form.weight" placeholder"请输入金重"><template #append><div>g</div></template></el-input></el-form-item>

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

8086汇编test指令学习

Test指令将两个操作数进行逻辑与运算&#xff0c;并根据运算结果设置相关的标志位。Test的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。 TEST AX,BX 与 AND AX,BX 命令有相同效果&#xff0c;只是Test指令不改变AX和BX的内容&#xff0c;而AND指令会把结果保…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

跟随角色镜头时,解决地图黑线/白线缝隙的三种方案

下面一共三个解决方案&#xff0c;这里我推荐第二个方案解决&#xff0c;因为够快速和简单。 现象&#xff1a; 解决方案一&#xff1a; 参考【Unity2D】去除地图中的黑线_unity选中后有线_香菇CST的博客-CSDN博客&#xff0c;博主解释是因为抗锯齿采样导致的问题。 具体到这…

YOLOv5算法改进(7)— 添加SimAM注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。SimAM&#xff08;Similarity-based Attention Mechanism&#xff09;是一种基于相似度的注意力机制&#xff0c;它的原理是通过计算查询向量与每个键向量之间的相似度&#xff0c;从而确定每个键向量对于查询向量的重要性…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …
最新文章