Nodejs + Websocket 指定发送及群聊的实现


Posted in NodeJs onJanuary 09, 2020

 目的

通过nodejs + ws (Websocket) 实现点对点发送及群聊发送
项目搭建直接跳过,这里列举一下用到的插件
yarn add ws

WebSocket

话不多说,直接上码

对比上一篇文章 << Nodejs+MongoDB 搭建服务( demo ) >> server.js 主要是增加了ws的引用,
webSocket 点对点也好,群聊也好,主要是用到一个方法 clients 它的作用就是存储了连接,
我们可以通过对每一个连接增加标识,然后根据接收到的信息进行解析,遍历然后发送正确的响应。

Nodejs + Websocket 指定发送及群聊的实现

先解析下代码(小声BB), 下面会有HTML页面

nbs.on("connection", (ws, req) => {
   ws.on("message", message => {
    // 这里解析数据
    const result = JSON.parse(message);
    // 是否是登陆,登陆后绑定id
    if (result.login) {
     ws.socketIdxos = result.id;
    } else {
     // 这里只做一个小的场景,不是登陆就是发送信息
     // 根据存储的id 是否是要 发送的对象 来单独响应
     nbs.clients.forEach(s => {
      if (s.socketIdxos == result.to && s.readyState == 1) {
       s.send(JSON.stringify({ data: result.mes }));
      }
     });
    }
   });
   ws.on("close", message => {
    console.log(ws.socketIdxos,"退出连接");
   });
  });

HTML

这里我分别建了三个页面其中两个模拟用户,一个模拟群聊

这是BBB用户,另一个页面是 AAA 只是改了下信息而已,就不都贴上来了,很简单

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>BBB111</title> 
  <script>
  const ws = new WebSocket("ws://localhost:8181");
  ws.onopen = function (e) {
   ws.send(JSON.stringify({
    "id":"BBB111",
    "login":true,
   }));
  }
  function sendMessage() {
    ws.send(JSON.stringify({
    "id":"BBB111", // 当前ID
    "login":false, // 是否登陆
		"to":"AAA111", // 发送对象
		"mes":"我是BBB111,这是发送给AAA111的消息" // 发送内容
   }));
  }
	function sendYUYUYU() {
    ws.send(JSON.stringify({
    "id":"BBB111",
    "login":false,
		"to":"YUYUYU",
		"mes":"我是BBB111,这是到群里的消息"
   }));
  }
  ws.onmessage = function (e) {
   console.log(e,"eeee-");
  }
  </script>
 </head>
  
 <body >
   <button onclick="sendMessage();"> 发送 </button>
	 <button onclick="sendYUYUYU();"> 群聊 </button>
 </body>
 </html>

下面的是只用来接收的群页面,更简单

<!DOCTYPE html>
  <html>
   <head>
    <meta charset="utf-8">
    <title>群聊</title>
    <script>
    const ws = new WebSocket("ws://localhost:8181");
    ws.onopen = function (e) {
     // 这里主要作用就是注册下群成立了 ......
     ws.send(JSON.stringify({ 
      "id":"YUYUYU", 
      "login":true,
     }));
    }
    ws.onmessage = function (e) {
     console.log(e,"eeee-");
    }
    </script>
   </head>
    
   <body >
  
   </body>
   </html>

展示

const ws = new WebSocket("ws://localhost:8181");
 localhost 可以换成的你的本机IP,这样页面在其他电脑也可以发送到你的页面上

Nodejs + Websocket 指定发送及群聊的实现

可以看到,在BBB的页面,接收到了AAA发送的信息

Nodejs + Websocket 指定发送及群聊的实现

无论是AAA发送的群里信息,还是BBB发送的群里信息,在群聊页面都是可以看到的

至此,一个简单的私聊,群聊 WebSocket 就完成了,最后希望大家有所收获,再会!!

参考网址如下:   https://3water.com/article/178117.htm

本篇文章是为记录小白的成长历程(主要是记性不好,记个笔记有保障,用到的时候可以拿出来瞅瞅) 2019/12/26

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

NodeJs 相关文章推荐
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 #NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 #NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 #NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 #NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 #NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 #NodeJs
NodeJS实现一个聊天室功能
Nov 25 #NodeJs
You might like
PHP 多进程 解决难题
2009/06/22 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
Yii中表单用法实例详解
2016/01/05 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python自定义类并使用的方法
2015/05/07 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
python实现画循环圆
2019/11/23 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python的logging模块基本用法
2020/12/24 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
广告设计应届生求职信
2014/03/01 职场文书
阳光体育活动总结
2014/04/30 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
承诺函范文
2015/01/21 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
工作后的感想
2015/08/07 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
Python函数式编程中itertools模块详解
2021/09/15 Python