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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(7)
Dec 23 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
JavaScript作用域示例详解
Jul 07 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
微信小程序 闭包写法详细介绍
Dec 14 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 Javascript
微信小程序实现折线图的示例代码
Jun 07 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
基于empty函数的判断详解
2013/06/17 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
php实现三级级联下拉框
2016/04/17 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
Python编写Windows Service服务程序
2018/01/04 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
django缓存配置的几种方法详解
2018/07/16 Python
python中JWT用户认证的实现
2020/05/18 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
国外的一些J2EE面试题一
2012/10/13 面试题
出纳员岗位职责风险
2014/03/06 职场文书
文明市民先进事迹
2014/05/15 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python