uniapp+websocket聊天功能实现

data() {
	return {
		// socket是否开启
		socketOpen: false,
		// 定时器
		timer: null,
	}
},
onLoad() {
	// socket初始化
	this.init()
	// 定时器,定时判断socket是否掉线
	this.timer = setInterval(() => {
		this.isSocketConnct()
	}, 6000)

},
onUnload() {
	// 关闭定时器
	clearInterval(this.timer)
	// 关闭Socket
	this.closeSocket()
},
methods: {
    // 接收到事件后处理的方法(可自己重写)
	onMessageHandle(obj) {
		// 根据自己业务逻辑重写
	},
	// 发送消息后处理的方法(可自己重写)
	sendMessageHandle(msg) {
		// 根据自己业务逻辑重写
	},
	// 发送消息方法
	send(value) {
		// 自定义消息体
		let param = {
			"code": 2,
			"body": value,
		}
		let msg = JSON.stringify(param)
		this.sendSocketMessage(msg)
	},
	// 发送消息
	sendSocketMessage(msg) {
		console.log("发送消息", msg);
		let that = this
		if (that.socketOpen) {
			uni.sendSocketMessage({
				data: msg,
				success: (res) => {
					console.log(res);
					setTimeout(() => {
						// json转对象
						let param = JSON.parse(msg)
						that.sendMessageHandle(param)
					}, 300)
				},
				fail(err) {
					console.log(err);
					// 发送失败处理
				}
			});
		} else {
			// Socket没有开启,重新连接并重新发送消息
			this.init()
			setTimeout(() => {
				this.sendSocketMessage(msg)
			}, 300)
		}
	},
	// 判断是否连接
	isSocketConnct() {
		if (!this.socketOpen) {
			console.log("WebSocket 再次连接!");
			this.init()
		}
	},

	// 初始化
	init() {
		this.connect()
		this.openSocket()
		this.onclose()
		this.onSocketMessage()
	},
	// 建立连接
	connect() {
		let token = getToken()
		uni.connectSocket({
			// 参数需要使用encodeURIComponent转码一下,不然onOpen可能监听不到的情况,原因是token中可能有空格,没有处理。
			url: `${WEBSOCKET_URL}/web/ws?token=${encodeURIComponent(token)}`,
			success(res) {
				console.log('连接成功', res);
			},
			fail(err) {
				console.log('连接失败', err);
			}
		});
	},
	// 打开Soceket
	openSocket() {
		let that = this
		uni.onSocketOpen((res) => {
			that.socketOpen = true
			console.log('WebSocket连接已打开!', res);
		});
	},
	// 监听关闭
	onclose() {
		let that = this
		uni.onSocketClose((res) => {
			that.socketOpen = false
			console.log('WebSocket 已关闭!', res);
		});
	},
	// 接收事件
	onSocketMessage() {
		let that = this
		uni.onSocketMessage((res) => {
			let obj = JSON.parse(res.data)
			console.log("接收事件", obj);
			this.onMessageHandle(obj)
		});
	},
	// 关闭
	closeSocket() {
		uni.closeSocket();
	},
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值