node.js + socket.io 实现点对点随机匹配聊天


Posted in Javascript onJune 30, 2017

真心佩服那些可以经常发布笔记的人,其实我也想经常发来的,奈何技术不够加上懒,要向大神们多多学习了,前段时间有用bomb平台自带的socket写一个聊天室,其实基本就是改了改它的demo,这次想实现一个随机私聊,所以自己基于node 和 socket.io 来搭服务,当然,第一次用node做东西玩,虽然做的不好,但是也蛮分享下哈。

先说说用到的东西, node 用来做后台服务,express 用来托管静态资源,然后socket.io 用来传送聊天数据。接下来说说思路,其实用socket.io来传数据是很简单的一件事情,我们只需要再前端页面引入 socket.io.js  然后再node端也require('socket.io'),把它在后端跑起来,那么前端就可以通过如下代码来发送或者接收信息。

//前端
socket = io.connect('ws://'+'服务器ip');
socket.emit('msg',{msg:'前端要发送的信息'});//要发送的信息(以对象的形式发送)
socket.on('msg2',function(data){
  ...
  //这里的data是后端传过来的信息
})
//后端
socket.on('msg',function(data){
  var data = data; //这里的data就是前端传过来的数据,即{msg:'前端要发送的信息'}
  console.log(data.msg) // 打印出 “前端要发送的信息”
})
//同理,后端要传信息给前端也是一样
socket.emit('msg2',{msg:'后端要发送的信息'});

我们来看后端怎么把socket跑起来

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
io.on('connection', function(socket){ //当前端执行 socket = io.connect('ws://'+host); 的时候,此处的io会监听到connection事件
 socket.on('msg',function(data){ 
 io.emit('onlineCount',freeList)
 //如果直接用io.emit来发送数据的话,这代表广播的形式,就是当前所有打开服务的前端页面都会收到这条消息。
 
   socket.emit('welcome',{msg:'欢迎...'})//这里将给当前连接的页面发送一个欢迎的对象数据
 })
 socket.on('disconnect',function(){
 //当前端页面关闭,或者失去连接时,后端会接收到disconnect事件
   
 })

})
http.listen(4000, function(){
 console.log('listening on *:4000');
});

当然不仅如此,因为websocket协议,是在浏览器和服务器之间建立了一个长链接来相互传输数据,对服务器而言,如果打开了好几个页面,那么就有好几个socket实例,每个建立连接的前端页面都会有一个socket实例,这样就为接下来的点对点私聊提供了思路。当然,我们也可以通过直接广播来传送信息,不过这适用于聊天室情景。

那如何实现点对点呢,之前说了,每个建立连接的页面都会产生一个socket实例,那么我们只需要后端在接收消息的同时,判断该socket实例是和哪个个实例在聊天,只把消息发送给另一个匹配的socket实例就好了。简单来说就像写信一样,我把消息发送给后端,然后告诉后端,这个消息是给xxx的,然后后端找到xxx对应的socket实例,将消息发给他就好了。

//前端
window.id = new Date().getTime()+""+Math.floor(Math.random()*899+100);
//每次登录,获取一个唯一的用户id
socket = io.connect('ws://'+host);
socket.emit('newUser',{ user_name : name, user_id : id})
//建立连接后,将我的用户名和id都传给后端

//后端
socket.on('newUser',function(data){
 var nickname = data.user_name,
  user_id = data.user_id;
 userServer[user_id] = socket;
 //后端接收后,将该用户socket保存在一个对象里,key值为id,value就是这个用户的socket
  
})

通过上面的代码,后端得到了一个userServer的对象,里面是每个连接socket和其id的对应值,这样,就可以通过每次发送信息时,附带要接收对象的id来达到点对点的数据传输。

接下来就是数据处理咯,如何取到对方的id啊等等,鉴于我表达能力有限,加上懒,就不??吕?~ 代码我都托管在github欢迎自己下下来看咯~https://github.com/mikoshu/mychatroom.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
Array.prototype 的泛型应用分析
Apr 30 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
Jun 01 Javascript
xtemplate node.js 的使用方法实例解析
Aug 22 Javascript
AngularJS 过滤器(自带和自建)详解
Sep 19 Javascript
React组件的三种写法总结
Jan 12 Javascript
Jquery获取radio选中的值
May 05 jQuery
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
详解三种方式解决vue中v-html元素中标签样式
Nov 22 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
详解vue中computed 和 watch的异同
Jun 30 #Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 #Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 #Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 #Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 #Javascript
js实现京东轮播图效果
Jun 30 #Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 #jQuery
You might like
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
php实现文件预览功能
2017/05/23 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
连锁经营管理专业大学生求职信
2013/10/30 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
农村文化活动总结
2014/08/28 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
行政经理岗位职责
2015/04/15 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python