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 相关文章推荐
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
js登录弹出层特效
Mar 07 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
JavaScript操作选择对象的简单实例
May 16 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
May 24 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
Aug 04 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
vue ssr+koa2构建服务端渲染的示例代码
Mar 23 Javascript
JavaScript onclick事件使用方法详解
May 15 Javascript
jquery实现简单每周轮换的日历
Sep 10 jQuery
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页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
python正则表达式match和search用法实例
2015/03/26 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python如何读取文件中图片格式
2020/01/13 Python
浅谈django channels 路由误导
2020/05/28 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
成功的餐厅经营创业计划书
2014/01/15 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
售房协议书范本2014
2014/10/23 职场文书
人民检察院起诉书
2015/05/20 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python