文章插图
用户登录
还记得前端触发的登录事件叫什么嘛
socket.emit( 'login', nickname);
叫 login,而且还携带了一个参数——用户想给自己起的昵称 nickname 。好,我们来写对应的后台逻辑
socket.on( 'login', function(nickname){
//do something
});
这里的do something要做什么呢?即对用户输入的昵称进行合法性校验,比如是否已经存在、长度限制、符号限制等 。球都麻袋,好像有哪里不对…
长度限制和符号限制?这俩哥们根本就不用放在服务器上做嘛,直接在前端就搞了 。所以我们的问题只剩一个了——昵称的唯一性 。
既然要检测昵称是否唯一,首先得有一个当前在线用户昵称的总集,不然去哪里检测昵称是否存在嘞?
所以要在全局维护一个数组,保存当前在线用户的昵称
varusers = [];
在这个数组里找用户通过 login 事件传过来的 nickname,如果不存在,说明当前昵称合法,用户可以叫这个名字,那么
socket.nickname = nickname; //记录下当前socket的nicknameusers.push(nickname);socket.emit( 'loginSuccess'); //触发loginSuccess事件
如果昵称已经存在了,就触发一登录失败事件,前端再做相应的交互即可 。
socket.emit( 'loginFailed'); 接收用户发送的消息并
按照约定好的事件名来写服务端的监听程序
socket.on( 'msgSend', function(msg){ socket.broadcast.emit( 'newMsg', socket.nickname, msg);});
这里调用的 api 是 socket 的广播事件,效果是广播消息到除了当前 socket 以外的所有 socket 。
系统消息的处理
剩下的工作就是处理系统消息了,首先要明确有哪些系统消息
提示用户加入
提示用户离开
更新在线用户数
提示用户加入
提示用户离开
更新在线用户数
当用户输入的昵称通过合法性校验以后,系统提示新加入的用户
io.sockets.emit( 'system',nickname, users.length, 'login');
io.sockets.emit()
的作用是向当前所有 socket 触发一个事件,这里要区别于socket.broadcast.emit() 。
仿照上面的代码,写出当用户离开时的广播事件:
io.sockets.emit( 'system', nickname, users.length, 'logout');
但是要写在哪里呢?这时候,就需要在服务端额外的监听一个断开事件
socket.on( 'disconnect', function(){
varindex = users.indexOf(socket.nickname); users.splice(index, 1); //将断开用户的昵称从全局数组users中删除io.sockets.emit( 'system', socket.nickname, users.length, 'logout');}); 总结
至此,一个基于 Node.js 的聊天室就算撸成了,当然还有许多可以优化的地方,不过核心功能也就这些,能看到这里的都是好汉,因为自己写完看了一遍,感觉真像是老太太的裹脚布——又臭又长
【本地连接在哪里 wifi怎么办理和安装】?? 阅读原文,拥有更好的阅读体验,也可以关注作者个人公众号进行进一步交流 。
- 中医心理学与西方心理学差别在哪里 华夏心理咨询培训机构怎么样
- 三叉穴在哪里 董氏奇穴治疗带状疱疹
- 想吃正宗阳澄湖大闸蟹去哪里买比较好 阳澄湖大闸蟹在哪里买
- 京东自营蜂蜜是真的吗 蜂蜜在哪里能买到真的
- 汗蒸东西十条附近哪里有汗蒸和桑拿 我家附近的汗蒸房在哪里
- 怎么知道一个女生敏感还是不敏感 女人敏感区在哪里图解
- 比较有名的肿瘤医院在哪里 全国看肿瘤最好的中医院
- N95口罩在哪里买
- 三门粉黛乱子草在哪里
- 巴拿马运河连接了什么海和什么海