Node.js中使用socket创建私聊和公聊聊天室


Posted in Javascript onNovember 19, 2015

先给大家展示效果图:

Node.js中使用socket创建私聊和公聊聊天室

在上篇文章给大家介绍使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室,本文继续介绍Node.js中使用socket创建私聊和公聊聊天室,具体详情请看下文吧。

nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express的,为了方便了解整个socket.io的使用.

例子请点击http://chat.lovewebgames.com/

源码下载https://github.com/tianxiangbing/chat

由于本人太穷,所以服务器和数据库都是使用的国外免费的,访问速度上可以会稍慢。

先说下我对socket.io的理解,websocket更像是开启了一个端口服务,来监视过往的通讯。所以我们可以依赖于当前站点80端口启socket服务,也可以放于其他端口上,比如:

 require('socket.io').listen(3000);

这样就是监视3000端口了,由于我用的免费服务器,没有权限打开其他端口,所以,我还是使用80了,由于80已经被express使用了,所以我只好在express使用的时候传进来了。

 var server = http.createServer(app);

 var socket = require(‘./socket/msg')(server);

然后 我在msg.js里是这样写的

var db = require('../db/mysql');

var sio = require('socket.io');

var IO = function(server) {

var io = sio.listen(server)

这样就和谐了,db是创建mysql连接的方法,不在本节内容里,略。

在socket.io里是这样的,首先创建一个io通道的连接,然后监视里面的socket的事件,nodejs是事件驱动嘛。代码如下:

io.on('connection', function(socket) {

        console.log('a user connected.');

        socket.on('disconnect', function() {

            console.log('user disconnected.');

        });

})

这时只要有用户连接上,就会进入connection中了,然后它的参数是个socket,如果是公聊,我们可以直接用

io.emit('chat message', {});

这种形式了。但我们这里是私聊,所以我们要临时的把这个socket对象保存在全局里,供与你私聊的对象使用找到你的socket,很绕口,其实这里的私聊,不算完全的点对点,它还是经过了服务器的,消息传给服务器,服务器再找到你要传达给的那个人的socket对象,发给他。这就是整个的过程了。这里我使用的是一个类数组对象来存储的.

var users = {},

usocket = {};

socket.on('user join', function(data) {

    users[username] = username;

    usocket[username] = socket;

})

由于我这里需要用户名登录,所以我就把用户名作为了唯一的标识(这只是一个例子,不要跟我谈用户名重复的情况),这里用类数组的形式的好处就是我不用循环也能够很快的找到它。再我给A发送私聊时,我会先在这个uscoket里面找到它,然后调用它的emit。

function sendUserMsg(data) {
 if (data.to in usocket) {
 console.log('================')
 console.log('to' + data.to, data);
 usocket[data.to].emit('to' + data.to, data);
 usocket[data.user].emit('to' + data.user, data);
 console.log('================')
 }
}

这里我emit了两次的原因是,我发给对方消息的同时,我自己也要收到这个消息,然后把它显示出来,为什么这样?其一,接口统一了,聊天里的内容全是服务器过来的,其二,证明我发送成功了。

然后我在客户端监听时,也用我自己的用户名起了一个to+用户名的事件监听。

socket.on('to' + user, function(data) {
 //console.log(data);
 formatMsg(data);
})

这样,不管是我发的消息,还是我收到消息,都会进入这个事件了。最后,在用户离开的时候别忘记delete掉这个对象。

socket.on('disconnect', function() {
 console.log('disconnect')
 if (username) {
 counter--;
 delete users[username];
 delete usocket[username];
 if (home.name == username) {
  homeLeave(username);
 }
 sendmsg({
  type: 0,
  msg: "用户<b>" + username + "</b>离开聊天室",
  counter: counter,
  users: users
 })
 }
});

好了,这样就大功告成了。

Javascript 相关文章推荐
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
JavaScript 错误处理与调试经验总结
Aug 10 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
Vuex中mutations与actions的区别详解
Mar 01 Javascript
Vue render深入开发讲解
Apr 13 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
vue 实现input表单元素的disabled示例
Oct 28 Javascript
JS+DIV实现拖动效果
Feb 11 Javascript
JS函数本身的作用域实例分析
Mar 16 Javascript
webpack安装配置与常见使用过程详解(结合vue)
Jun 01 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 #Javascript
javascript实现二级级联菜单的简单制作
Nov 19 #Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
Nov 19 #Javascript
javascript中checkbox使用方法实例演示
Nov 19 #Javascript
jquery实现表格隔行换色效果
Nov 19 #Javascript
javascript设计简单的秒表计时器
Sep 05 #Javascript
跟我学习javascript的定时器
Nov 19 #Javascript
You might like
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
Python实现矩阵转置的方法分析
2017/11/24 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
中学自我评价
2014/01/31 职场文书
农村党员对照检查材料
2014/09/24 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书