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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 Javascript
jQuery复制表单元素附源码分享效果演示
Sep 30 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
微信小程序开发之实现自定义Toast弹框
Jun 08 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
vue的keep-alive中使用EventBus的方法
Apr 23 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
Aug 10 Javascript
antd form表单数据回显操作
Nov 02 Javascript
React 并发功能体验(前端的并发模式)
Jul 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 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
简单的js表格操作
2016/09/24 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
python发送邮件接收邮件示例分享
2014/01/21 Python
Python构造函数及解构函数介绍
2015/02/26 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python运行其他程序的实现方法
2017/07/14 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
当当网软件测试笔试题
2015/11/24 面试题
银行求职信
2014/05/31 职场文书
留守儿童工作方案
2014/06/02 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
小学体育组工作总结
2015/08/13 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android