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 相关文章推荐
prototype 中文参数乱码解决方案
Nov 09 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
Feb 05 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
js中的触发事件对象event.srcElement与event.target详解
Mar 15 Javascript
基于AngularJS实现表单验证功能
Jul 28 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
Aug 14 jQuery
vue单页面实现当前页面刷新或跳转时提示保存
Nov 02 Javascript
JS实现放烟花效果
Mar 10 Javascript
JavaScript实现点击切换功能
Jan 27 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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
curl实现站外采集的方法和技巧
2014/01/31 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
django query模块
2019/04/20 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
小学毕业家长寄语
2014/01/19 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
毕业生对母校寄语
2015/02/26 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
创业计划书之物流运送
2019/09/17 职场文书
JavaScript分页组件使用方法详解
2021/07/26 Javascript