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 相关文章推荐
一个报数游戏js版(约瑟夫环问题)
Aug 05 Javascript
js函数setTimeout延迟执行的简单介绍
Jul 17 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
Jun 06 Javascript
js获取域名的方法
Jan 27 Javascript
JavaScript实现简单的tab选项卡切换
Jan 05 Javascript
第六章之辅组类与响应式工具
Apr 25 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
Angular2库初探
Mar 01 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
如何使用less实现随机下雪动画详解
Jan 02 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
20多个小事例带你重温ES10新特性(小结)
Sep 29 Javascript
详解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编程网上资源导航
2006/10/09 PHP
php字符串截取的简单方法
2013/07/04 PHP
php实现json编码的方法
2015/07/30 PHP
菜单效果
2006/10/14 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
树莓派实现移动拍照
2019/06/22 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
三查三看党性分析材料
2014/02/18 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书