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 prototype属性使用说明
May 13 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
js取模(求余数)隔行变色
May 15 Javascript
小结Node.js中非阻塞IO和事件循环
Sep 18 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
JS中利用FileReader实现上传图片前本地预览功能
Mar 02 Javascript
vue.js自定义组件directives的实例代码
Nov 09 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
Jul 28 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
Nov 10 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
原生js实现日期联动
2015/01/12 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
Vue组件化开发思考
2018/02/02 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
python控制台显示时钟的示例
2014/02/24 Python
Python解析nginx日志文件
2015/05/11 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
python与字符编码问题
2019/05/24 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python多线程获取返回值代码实例
2020/02/17 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
JSF界面控制层技术
2013/06/17 面试题
新闻记者个人求职的自我评价
2013/11/28 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
2014年度考核工作总结
2014/12/24 职场文书
刘公岛导游词
2015/02/05 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
dubbo服务整合zipkin详解
2021/07/26 Java/Android
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
Golang bufio详细讲解
2022/04/21 Golang
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers