uniapp中使用socket IO

UniApp跨平台即时通讯实战:Socket.IO与WebSocket的完美融合 本文详细介绍了在UniApp项目中实现跨平台即时通讯的实战方案,重点阐述了如何将Socket.IO的稳定特性与WebSocket标准协议完美融合。通过使用适配插件解决多端兼容性问题,文章提供了从环境搭建、连接管理到消息收发与房间功能的完整代码示例,并分享了针对小程序、App等平台的特殊配置与调试技巧,帮助开发者构建高效、稳定的实时通信应用。 阅读详情
AI摘要

本文详细介绍了如何使用Vue和Socket.IO库实现网页间的实时通信,包括依赖安装、配置文件设置、Vuex状态管理以及关键操作如连接、断开和消息发送。通过实例展示了如何在聊天应用中建立持久连接并处理服务器推送事件。

用socket io 来完成实时通信。

首先 先安装socket 依赖

在控制台中输入以下任意一个命令行。
这里我用的第二种

npm install vue-socket.io --save

npm install socket.io-client --save

配置文件

安装完成后
创建一个仓库在默认路径下与static同级创建一个store文件夹,文件夹下有index.js。index.js中用于写各种vuex中的逻辑问题

import Vue from 'vue'
import Vuex from 'vuex'
import io from '@hyoga/uni-socket.io';
import conf from '@/common/lib/config.js'

Vue.use(Vuex)

export default new Vuex.Store({
	state: {
		//仓库中的全局变量
		isLoad: false,
		socket:null, 
		lineState:false,
		clientId:null,//对方
		kefuId:null,
		target:null,//目标
		chatList:[],
		msg:null,
		action:null,
	},
	// 计算属性 可以获得参数,第一个是state,第二个是getters(自身) 用户传参(state,getters)=> (id)=>{}
	getters: {
		getClientId: state => state.clientId,
		getKeFuId: state => state.kefuId,
		getTarget: state => state.target,
		getChatList: state => state.chatList,
		getMsg: state => state.msg,
		getAction: state => state.action
	},
	// 动态改变变量值
	mutations: {
		//示例
		setIsLoad(state, isLoad) {
			state.isLoad = isLoad
		},
	},
	actions: {
	//用于写异步方法
	//链接socketIO
	connectSocket({state, dispatch},data) {
			// 这里的conf.socketUrl往下有提到 连接后赋值给socket
			const socket = io(conf.socketUrl, {
				//这里是连接时所携带的数据
			  query: data,
			  	//连接方式
			  transports: [ 'websocket' ],
			  //过期时间
			  timeout: 5000,
			});
			//socket监听服务器发送的消息  服务器中一定有emit(‘connect’)。
			socket.on('connect', () => {
			  console.log('ws 已连接');
			  //将连接成功的socket 赋值给变量 state.socket
			  state.socket = socket 
			  //连接成功后,将上线状态改为true
			  state.lineState = true
			  // socket.io 唯一连接id,可以监控这个id实现点对点通讯
			  const { id } = socket;
			  //将连接的socket  即id 赋值给clientId (房间号)
			  state.clientId = id
			  //派发事件
			  const chatPush = (e) => {
				  uni.$emit('chatPush', e)
			  }
			  //派发没有分配客服的事件, 在index.vue页面引用 用:
			  const noKefu = () => {
				  uni.$emit('noKefu')
			  }
			  // 监听服务器连接成功后的状态
			  socket.on(id, (message, fn) => {
			  	//连接成功后,接受服务器返回过来的信息
				  state.msg = message
				  const action =  message.data.action
				  //连接成功后 获取返回过来的的action
				  state.action = action
				  const data = message.data
				  console.log('action:',action);
				  console.log('ws data:', data);
				  switch (action){
				  	case 'online':
						uni.showToast({
							title:"连接成功",
							icon:'none'
						})
						state.kefuId = message.data.payload.kefuId
				  		break;
				  	case 'no':
				  		uni.showToast({
				  			title:"没有可分配客服",
				  			icon:'none'
				  		})
				  		//这里调用上面派发的没有客服的方法是true,就关连接
						noKefu()
						//如果在线状态是
						if(state.lineState) {
							this.dispatch('closeSocket')
						}
				  		break;
					case 'noline':
						uni.showToast({
							title:"对方不在线",
							icon:'none'
						})
						break;
					case 'exchange':	
						//当是exchange类型的消息,就添加消息至消息列表					
						// 拿到数据传出去
						// console.log(123);
						 chatPush(data)
						break;
				  }
				 
			    // 收到服务器推送的消息,可以跟进自身业务进行操作
				if(typeof fn === 'function') {
					fn('ok')
				}
			  });
			  // 主动向服务器发送数据
			  // socket.emit('send_data', {
			  //   time: +new Date(),
			  // });
			});
			//监听服务器的 在线 方法
			socket.on('online', (msg) => {
				console.log(msg);
			});
			//监听服务器的断开连接方法
			socket.on('disconnect', () => {
				console.log("断开链接");
				if(state.lineState) {
					this.dispatch('closeSocket')
				}
			});
			//监听服务器出现错误的方法
			socket.on('error', (msg) => {
			  console.log('ws error', msg);
			  if(state.lineState) {
			  	this.dispatch('closeSocket')
			  }
			});
		},
		//关闭连接
		closeSocket({state, dispatch}) {
			const offChat = ((e) => {
				uni.$off('chatPush', e)
			})
			state.lineState === false
			offChat()
			if(state.socket !== null) {
				state.socket.close()
				state.socket = null
				state.lineState = false
				state.target = ''
			}
		},
		//发送信息
		sendMsg({state, dispatch}, data) {
			console.log(data);
			state.socket.emit('exchange', data)
		}
	}
})

在common的config文件中定义socket io链接地址

export default{
	//这里是请求接口的地址
	baseUrl:"http://wech******ip.com",
	//这里是socket io通信地址
	socketUrl:"http://we***********m/chat",
	env:'dev'
}

这里的common/config.js文件是自己创建的。主要作用是存放请求地址,在common的文件夹下还有一个与config同级的文件request.js是用来写异步请求方法的,文章主题不是它,这里就不赘述了。request中与本文相关的内容就是,在request.js中引入vuex的仓库,用于连接仓库和页面

// 主要看这个地方,在这个文件里引入仓库
import $store from '@/store/index.js'
import $config from '@/common/lib/config.js'
export default {
	// 全局配置
	common: {
		baseUrl: $config.baseUrl,
		header: {
			'Content-Type': 'application/json;charset=UTF-8',
			'Content-Type': 'application/x-www-form-urlencoded',
		},
		data: {},
		method: 'GET',
		dataType: 'json'
	},
	// 请求  返回promise
	request(options = {}) {
		let token = true
		options.url = this.common.baseUrl + options.url
		options.header = options.header || this.common.header
		options.data = options.data || this.common.data
		options.method = options.method || this.common.method
		options.dataType = options.dataType || this.common.dataType
		if(options.token === false) {
			token = false
		}
		//在这里判断token的时候应用$store
		if(token) {
			if(!$store.state.user.token) {
				console.log('没有token');
				return uni.reLaunch({
					url:'/pages/login/login'
				})
			}
			options.header.Authorization = `Bearer ${$store.state.user.token}`
		} 
		return new Promise((resolve, reject) => {
			// 请求前
			
			// 请求中
			uni.request({
				...options,
				success: (res) => {
					// 服务端失败
					if(res.statusCode !==200){
						uni.showToast({
							title:res.data.msg || '服务端请求失败',
							icon:'none'
						})
						return reject()
					}
					let data = res.data
					resolve(data)
				},
				fail: (err) => {
					uni.showToast({
						title:err.errMsg || '请求失败',
						icon:'none'
					})
					return reject(err)
				}
			})
		})
	},
	
	// get 请求
	get(url, data = {}, options = {} ){
		options.url = url
		options.data = data
		options.method = 'GET'
		return this.request(options)
	},
	// post 请求
	post(url, data = {}, options = {} ){
		options.url = url
		options.data = data
		options.method = 'POST'
		return this.request(options)
	},
	// post 请求
	put(url, data = {}, options = {} ){
		options.url = url
		options.data = data
		options.method = 'PUT'
		return this.request(options)
	},
	// post 请求
	del(url, data = {}, options = {} ){
		options.url = url
		options.data = data
		options.method = 'DELETE'
		return this.request(options)
	}
}

避开这3个坑!UniApp中使用Socket.IO的实战避坑指南 本文深入解析了在UniApp中使用Socket.IO实现即时通讯时常见的三大核心问题:微信小程序真机调试连接失败、iOS端消息延迟和多页面Socket实例冲突。针对这些问题,提供了详细的解决方案和优化配置,包括微信小程序的WSS协议强制配置、iOS后台任务处理和集中式Socket管理架构,帮助开发者高效实现跨平台实时通信功能。 阅读详情

相关推荐

uniapp中使用Socket.IO/websocket实现即时通讯聊天,支持多平台

1.说明: uniapp对多平台适应性好,而经改造的socket.io也适应于uniapp的多个平台, h5, android/ios, 微信小程序等 socket.io 比websocket优势: 支持多平台,支持连接管理(自动重连等). 2.使用: 2.1 导入js库: 引用uniapp专业的socket.io.js const uniio = require('./uni-socket.io'); 2.1 连接: 前提: 使用node express框架, 或springboot 框架打开socke

kong_dzq的博客 8155

uniapp 中封装|使用 socket.io-client

要在uniapp中封装websocket,您可以使用uni-app插件市场中的socket.io-client插件。此插件可以使您轻松地在uniapp应用程序中添加websocket支持,并具有心跳特性及重连功能。现在,您可以在整个应用程序中使用this.$socket对象来访问您的websocket连接,并使用其公开的方法和事件监听器。您可以在HBuilderX中的插件市场中找到此插件并安装。

DiuWang的博客 3985

hyoga-uni-socket.io:适用于uni-app的socket.io封装,可用于uni-app、微信小程序

@hyoga/uni-socket 重写 socket.io-client 的 engin.io-client 处理件,h5 依旧使用原生 WebSocket,APP 与小程序使用 uni-app 的 WebSocket 协议,所以 h5 端任然可以支持长轮询等方式,APP 与小程序只能支持 WebSocket 协议。 安装 // 建议使用npm或yarn包形式引入以保证插件的更新迭代 npm i @hyoga/uni-socket.io --save // yarn add @hyoga/uni-socket.io 版本选择 使用本插件,请注意插件版本与服务端 socket.io 版本要匹配,否则将会出现无法连接服务器的问题。 uni-socket 版本 服务端 socket.io 版本 1.x 2.x 2.x 3.x 3.x 4.x 使用 import io from '@hyoga/

uni-app实战直播app全栈开发

适用人群具有Html+Css+JavaScript基础,有一定的Vue.js基础,挑战高薪职位课程概述本季度为uni-app + egg.js 实战直播app、小程序全栈开发,课程涉及:node.js直播服务器搭建,socket.io实时送礼物、实时弹幕功能等。一次开发,同时搞定Android、iOS、小程序端。

speedy-im:基于uni-app与uni-socket.io的即时通讯项目

speedy-im 该项目已停止更新,由于项目无需支持小程序以及 H5,故使用 React-Native 进行重构,并将项目拆分重构,新项目功能更完整,性能更佳。 新项目请查看

适用于uni-app的socket.io封装,可用于uni-app、微信小程序.zip

微信小程序的优势在于它方便快捷、轻量级、跨平台、丰富的推广方式、丰富的功能接口、数据分析与优化、结合微信支付、支持多场景应用、社交功能以及多端同步等。这些优点使得小程序能够满足用户的多种需求,提供更好的用户体验

weapp.socket.io源码

【代码】weapp.socket.io源码。

qq_55139096的博客 331

uni.socket.io.js、针对手机端改的一个版本

uni.socket.io.js、针对手机端改的一个版本

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template> <view class=""> <scroll-view scroll-y="true" class="scroll-box" :style="{ height: `${windowObj.windowHeight - windowObj.statusBarHeight

大白菜代码的博客 1006

Autodesk全家桶安装总报错1603?一个服务设置搞定3dsMax和CAD安装回滚问题

本文详细解析了Autodesk全家桶安装过程中常见的1603错误,特别是3ds Max和CAD安装回滚问题。通过调整AdskLicensingService服务的账户权限,提供四步修复法和安装流程优化策略,帮助用户彻底解决安装难题,提升Autodesk软件的安装成功率。

weixin_30955617的博客 1121

均匀分布产生高斯分布

均匀分布产生高斯分布 文章目录均匀分布产生高斯分布简介方法和证明代码效果引用 简介 方法和证明 代码 效果 引用

gy_Rick的博客 5317

UNIAPP+Socket.io实战:从零搭建跨平台聊天室(附完整代码)

本文详细介绍了如何利用UNIAPP与Socket.io技术栈,从零开始构建一个支持H5、小程序及App的多端实时聊天室。内容涵盖前后端环境搭建、核心逻辑实现、多端适配技巧及性能优化方案,并提供了完整的实战代码,帮助开发者快速掌握跨平台实时通讯开发。

a3b4c5的博客 873

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3067

用uniapp 及socket.io做一个简单聊天app 3

【代码】用uniapp 及socket.io做一个简单聊天app 3。

大白菜代码的博客 746

SPSS中的数据分析—信度效度检验【1】

前一段时间跟大家分享了好几篇关于EXCEL方面的数据分析知识,不知道大家都掌握得怎么样了。今天咱们换个口味,给大家讲一下关于SPSS中的数据分析——信度效度检验。 现阶段正处在毕业季阶段,很多同学可能都正在忙着去弄自己的论文和答辩(不知道大家在翟天临上热搜这个事情上有没有做出过一定贡献),很多时候我们在写论文答辩甚至于其他课题研究的时候都会选择用问卷这种形式来收集数据。最后我们只需要针对问卷所取...

小白数据营的博客 6万+

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4767

uniapp socket.io即时通讯后台PHPsocket.io

1 uniapp中安装socket.io npm install vue-socket.io --save 2 在根目录创建socket.js import io from 'socket.io-client' let socket = io.connect('IP地址端口号'); module.exports = socket; 3 在项目中引入文件 import socket from '../../socket.js' mounted() { // 监听状态 //聊天室有新人加入,服务端

笔记课堂 2177

Android 系统状态栏中实现高斯模糊背景

至此,我们已经完成了在 Android 系统的 SystemUI 中实现高斯模糊背景的过程。通过以上的布局和代码修改,我们可以在状态栏中看到具有高斯模糊效果的背景。同时,为了在不同版本的 Android 系统上适配高斯模糊效果,可能需要进行一些额外的代码调整和兼容性处理。希望本文能够帮助你理解如何在 Android 系统的 SystemUI 中实现高斯模糊背景,并通过提供的源代码进行相应的开发和调试。首先,我们需要在 SystemUI 的布局文件中添加一个用于展示高斯模糊背景的视图。属性来开启模糊效果。

CyberSparkZ的博客 870

uniapp即时通讯、用socket.io-client的坑

uniapp即时通讯 历时一个月,高仿聊天APP雏形基本已完成,前端采用uni纯nvue混合开发,采用socket.io-client通讯协议来进行通讯,历史数据存储在手机、会话数据存在数据库。 下面是一些功能截图

weixin_45361998的博客 3631

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。

智慧空间实验室 6051

RK3588部署YOLOv11与RKNN全流程教程

本文详细介绍了在RK3588开发板上部署YOLOv11目标检测模型的全流程。主要内容包括:PC端CUDA/cuDNN环境配置、Anaconda虚拟环境搭建、RKNN Toolkit2安装;YOLOv11模型从PyTorch到ONNX再到RKNN的格式转换;以及RK3588开发板的系统配置、RKNPU驱动安装和最终推理实现。教程提供了完整的代码示例,帮助开发者快速在边缘设备上实现高效的AI推理应用,涵盖从环境准备到实时检测的全套解决方案。

FJN110的博客 375

UniApp + Socket.IO实战:5步搞定跨平台聊天室(附完整代码)

本文详细介绍了如何使用UniApp和Socket.IO构建跨平台聊天室应用,涵盖从架构设计到性能优化的完整流程。通过5个关键步骤,开发者可以快速实现即时通讯功能,支持多平台运行,包括iOS、Android和H5等。文章提供了完整代码示例,帮助开发者掌握实时通讯的核心技术。

q1w3e5r7t9y的博客 191

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

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

uniapp 做聊天,socket.io 的心跳和断线重连我调了一整天

uniapp对接socket.io实现聊天功能,需注意H5与小程序差异。关键在于自控重连:关闭socket.io自动重连,手动管理断线重连(最多10次),每次重连后重新绑定事件监听。心跳每25秒一次,防止假连接。私聊房间ID按用户ID排序生成,确保会话一致。小程序必须显式配置transports: ['websocket', 'polling'],避免连接失败。页面卸载时主动close连接,后台返回时检测状态并重连。核心是心跳保活+自定义重连+事件重建,确保消息稳定可靠。

yzb20082009的专栏 93

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

用uniapp 及socket.io做一个简单聊天app 4

用户登陆后进入到friends页。

大白菜代码的博客 686

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

UniApp实战:用Socket.IO打造跨平台聊天室(附完整Node.js后端代码)

本文详细介绍了如何使用UniApp和Socket.IO构建跨平台聊天室,涵盖从环境搭建到前后端联调的完整流程。通过实战案例展示即时通讯功能的实现,包括消息转发、状态管理和多平台兼容性处理,帮助开发者快速掌握实时通讯技术。

706

用uniapp 及socket.io做一个简单聊天app 5

【代码】用uniapp 及socket.io做一个简单聊天app 5。

大白菜代码的博客 612
上一篇: 基于uniapp做的聊天系统中,使用scroll-view实现动态滚动到最底部
下一篇: 基于uniapp做的聊天系统中,使用scroll-view实现下拉加载查看消息记录
Boo_crob
博客等级 码龄7年 14粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值