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

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 335

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 530

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

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

a3b4c5的博客 873

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 535

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

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

大白菜代码的博客 746

Adversarial Texture for Fooling Person Detectors in the Physical World

本文提出了对抗纹理的想法(AdvTexture),与基本补丁攻击不同对抗纹理可以生成任意大小,可以覆盖任意大小的不了,并且纹理的任何局部都有对抗性的效果。当衣服被对抗纹理覆盖是,摄像头捕捉到的每一个局部区域都可以攻击探测器,这成功解决了片段缺失的问题。提出了一种两阶段生成方法:基于环形收割的可扩展生成攻击(TC-EGA)来制作广告纹理。第一阶段,训练一个全卷积网络FCN作为生成器,通过采样随机潜变量作为输入来产生纹理(不同于GAN中传统的生成器架构,每一层都使用卷积运算)......

weixin_49171105的博客 1067

UE4入门实例17(Unreal制作卡通Post Process材质球)

效果展示 #1 创建Post Porcess材质球 #2 编写Shader功能 #3 设置场景区域内风格化渲染 #1 创建Post Porcess材质球 #2 编写Shader功能 创建基础效果 移除现有通道渲染 设置视图渲染范围 #3 设置场景区域内风格化渲染 #4 加群下载Shader源码:284105567 ...

Unity3d 攻城师一枚 1345

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

第20期-英伟达笔试题型解析

英伟达作为AI领域的缔造者及硬件基石,是这几年最为炙手可热的公司。英伟达以其高性能GPU设计闻名,硬件工程师岗位的招聘通常包括笔试和技术面试,考察领域涵盖数字电路设计、处理器架构、嵌入式系统和信号处理等。通过搜索公开平台,收集了候选人的面试经历和相关技术问题,,通过分析公开平台收集的笔试面试经验,结合英伟达的GPU架构特点,整理出可能涉及的典型题目,并提供详细解析。 以下是基于英伟达(Nvidia)硬件工程师笔试题型的解析与总结,涵盖核心知识点、解题思路及案例分析。

启芯硬件的博客 746

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

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

weixin_45361998的博客 3631

Oracle EBS Tax 四国实现详解:印度、巴西、美国、阿根廷

印度:务必启用India Localization模块,不要尝试用标准EBTax模拟GST逻辑 巴西:必须配置NF-e接口,建议聘请本地税务顾问设置CFOP和NCM代码映射 美国:跨州业务强烈建议购买Vertex或Avalara服务,自建税率表维护成本极高 阿根廷:注意1:1:1架构限制,提前规划Legal Entity和OU结构

金牌架构师 260

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在 Android 系统这个庞大而复杂的体系里,RIL(Radio Interface Layer,无线接口层)绝对是个关键角色。简单来讲,它就像一座桥梁,一头连着手机基带,另一头接着上层应用 ,在应用程序和调制解调器(Modem)之间搭建起了信息交流的通道。想象一下,咱们在手机上点击拨号按钮,或者编辑一条短信发送出去,这些操作产生的请求并不会直接到达手机的基带处理器。而是先由 RIL 接手,它把这些来自上层应用程序的请求,像拨号、发送短信这类,巧妙地转换成能够和基带处理器顺畅交互的命令。

大模型大数据攻城狮的专栏 1598

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

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

q1w3e5r7t9y的博客 191

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

yzb20082009的专栏 93

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

用户登陆后进入到friends页。

大白菜代码的博客 686

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值