obj = JSON.parse(obj);
// 将所有uid对应的连接conn存到一个对象里面
conns[‘’+obj.uid+‘’] = conn;
if(obj.type===1){
let isuser = users.some(item=>{
return item.uid === obj.uid
})
if(!isuser){
users.push({
nickname: obj.nickname,
uid: obj.uid
});
}
boardcast({
type: 1,
date: moment().format(‘YYYY-MM-DD HH:mm:ss’),
msg: obj.nickname+‘加入聊天室’,
users: users,
uid: obj.uid,
nickname: obj.nickname,
// 增加参数
bridge: obj.bridge
});
} else {
boardcast({
type: 2,
date: moment().format(‘YYYY-MM-DD HH:mm:ss’),
msg: obj.msg,
uid: obj.uid,
nickname: obj.nickname,
// 增加参数
bridge: obj.bridge
});
}
})
conn.on(“close”, function (code, reason) {
console.log(“关闭连接”)
});
conn.on(“error”, function (code, reason) {
console.log(“异常关闭”)
});
}).listen(8001)
console.log(“WebSocket建立完毕”)
主体结构还是和第二章类型,不同的是:
1、每次将uid对应的conn存储到一个对象conns上
2、根据客户端传入的参数bridge来判断,是群发还是一对一发送
3、群发还是第二章逻辑即可
server.connections.forEach((conn, index) => {
conn.sendText(JSON.stringify(obj));
})
4、一对一发送,bridge里面是一对一的两个用户uid,这样就可以在conns对象上找到uid对应的连接conn,并用conn发送信息即可
if(obj.bridge && obj.bridge.length){
obj.bridge.forEach(item=>{
conns[item].sendText(JSON.stringify(obj));
})
return;
}
WebSocket客户端
export default {
…
data(){
return {
title: ‘群聊’,
uid: ‘’,
nickname: ‘’,
socket: ‘’,
msg: ‘’,
// 当前用户所有消息
messageList: [],
users: [],
bridge: []
}
},
mounted() {
…
},
computed: {
// 当前对话渲染的msg列表
currentMessage() {
let vm = this;
// 筛选只有bridge相同的对话,展示出来
// 数组比较,先转成字符串
let data = vm.messageList.filter(item=>{
return item.bridge.sort().join(‘,’) == vm.bridge.sort().join(‘,’)
})
return data;
}
},
methods: {
// 切换到群聊
triggerGroup() {
this.bridge = [];
this.title = ‘群聊’;
},
// 切到具体个人
triggerPersonal(item) {
if(this.uid === item.uid){
return;
}
// 将当前用户uid,和需要对话的uid放入bridge
this.bridge = [this.uid, item.uid];
this.title = ‘和’ + item.nickname + ‘聊天’;
},
send(){
if(!this.msg){
return
}
this.sendMessage(2, this.msg)
},
sendMessage(type, msg){
this.socket.send(JSON.stringify({
uid: this.uid,
type: type,
nickname: this.nickname,
msg: msg,
// 增加bridge参数
bridge: this.bridge
}));
this.msg = ‘’;
},
conWebSocket(){
let vm = this;
if(window.WebSocket){
vm.socket = new WebSocket(‘ws://localhost:8001’);
let socket = vm.socket;
socket.onopen = function(e){
console.log(“连接服务器成功”);
if(!vm.uid){
…
}
// 这里将sendMessage方法if外面
vm.sendMessage(1)
}
socket.onclose = function(e){
console.log(“服务器关闭”);
}
socket.onerror = function(){
console.log(“连接出错”);
}
// 接收服务器的消息
socket.onmessage = function(e){
let message = JSON.parse(e.data);
vm.messageList.push(message);
if(message.users) {
vm.users = message.users;
}
}
}
},
login(){
…
}
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://i-blog.csdnimg.cn/blog_migrate/833fb07d2524793cd44196dee8435fc6.jpeg)
最后
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取。
截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://i-blog.csdnimg.cn/blog_migrate/833fb07d2524793cd44196dee8435fc6.jpeg)
最后
[外链图片转存中…(img-83kBL2PF-1712467339618)]
[外链图片转存中…(img-sJ0CCur8-1712467339618)]
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取。