websocket聊天室情景处理———断线与退出

最近自己在做一个包含聊天功能的项目,其中用到的Vue+webscocket,遇到了好多问题,包括自己遇到的一些需求。

需求:

  1. 断线自动连接
  2. 判断主动退出和被动掉线
  3. 聊天框消息不因添加而向下滚动

解决方法:

  1. 断线在监听里面,然后关闭当前webSocket进程后再去请求创建新的ws进程;
	this.socket.onclose  = function(e){
			let logout = CHAT.logout()//退出聊天
			let admin_logout = ADMIN_CHAT.logout()//admin聊天退出
			console.log('主聊天断开')
			if(logout && admin_logout){//判断
				setTimeout(()=>{
					let reloadWS = store.state.reloadWS?store.state.reloadWS+1:1
					store.commit('merge',{
						reloadWS:reloadWS,
					})
				},1000)
			}
		}

2 第一种情况:主动退出,调用logout

logout:function(){
	this.socket.close()
	this.socket.onclose =  function(e){
		console.log('用户主动退出!')
	}
	return true
}

第二种情况:被动掉线,断线自动连接,见1。

3.聊天界面的消息是不断添加的,但是如果用户想查看上面的记录时,不做处理的话会被新消息强制拖到底部。为解决这种情况添加聊天界面滚动条判断。

最主要的问题还是解决vue 在push数据时动态加载导致滚轮滚动到底的问题。
我尝试过了splice(start,deleteCount,val1,val2,…),但是还是会触发,之后我用了concat(返回一个新数组,是将参数添加到原数组中构成的 ),没有触发滚动条,而且消息也添加了进去。

查了下vue官方文档,里面介绍的vue关于数组更新检测的触发机制,如下

变异方法

Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()
替换数组

变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

CHAT.msgArr = CHAT.msgArr.concat(data)

你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

当你尝试使用Android Debug Bridge (adb) 的 `push` 命令将一个文件推送到 Android 设备或模拟器上,如果文件确实非常大,比如超过了设备可用存储空间的一部分,adb 可能会显示类似于 "Operation would block" 或者 "Permission denied" 的错误消息,这是因为大文件传输可能会因为内存限制而被操作系统中断,或者因为存储空间不足导致无法一次性完成。 具体可能的错误信息可能包括: - "Permission denied (publickey): Input/output error" - "Operation would block: Large file" - "Error writing file: Out of space" 这通常意味着你需要采取一些措施: 1. **分批传输**:如果文件太大,你可以考虑将其分割成多个小文件,然后分别推送。 2. **清理设备存储**:检查设备是否有足够的可用空间,如果有,删除不必要的应用、文件或数据以腾出空间。 3. **调整设备设置**:在设备的开发者选项中,允许ADB调试并开启USB调试模式,这可能允许更大的文件传输。 4. **使用 `adb pull` 再 `adb push`**:先从设备上下载文件到电脑,处理好后,再推送到设备上。 5. **使用网络传输工具**:如使用Wi-Fi共享文件夹,而不是直接通过USB连接传输。 相关问题: 1. 如何解决adb push时因文件过大导致的"Permission denied"错误? 2. 是否可以在不连接电脑的情况下,仅通过adb命令在两个Android设备间传输大文件? 3. 如何避免adb在传输大文件时因内存限制导致的问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值