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 相关文章推荐
一个简单的js动画效果代码
Jul 20 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
js 中的switch表达式使用示例
Jun 03 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
详解Bootstrap各式各样的按钮(推荐)
Dec 13 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 jQuery
vue的事件绑定与方法详解
Aug 16 Javascript
vue计算属性get和set用法示例
Feb 08 Javascript
vue使用i18n实现国际化的方法详解
Sep 05 Javascript
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
PHP实现文件安全下载
2006/10/09 PHP
php向js函数传参的几种方法
2014/08/10 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
javascript 写类方式之五
2009/07/05 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
Python入门篇之文件
2014/10/20 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python 处理图片像素点的实例
2019/01/08 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
幼儿园元旦活动感言
2014/03/02 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS