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中onmouse事件在div中失效问题的解决方法
Jan 09 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
jquery+css3打造一款ajax分页插件(自写)
Jun 18 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
jQuery实现简易的天天爱消除小游戏
Oct 16 Javascript
JavaScript两个变量交换值的实现方法
Mar 01 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
微信小程序实现提交input信息到后台的方法示例
Jan 19 Javascript
layui实现三级联动效果
Jul 26 Javascript
vue+koa2搭建mock数据环境的详细教程
May 18 Javascript
vue.js实现双击放大预览功能
Jun 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
PHP中ADODB类详解
2008/03/25 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
js实现继承的5种方式
2015/12/01 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
详解小程序云开发数据库
2019/05/20 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Django框架模板用法入门教程
2019/11/04 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
Python中如何定义一个函数
2016/09/06 面试题
2014年防汛工作总结
2014/12/08 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
Django实现翻页的示例代码
2021/05/24 Python
详细了解java监听器和过滤器
2021/07/09 Java/Android