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 相关文章推荐
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python实现图片上添加图片
2019/11/26 Python
python获取array中指定元素的示例
2019/11/26 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
什么是索引指示器
2012/08/20 面试题
乡镇爱国卫生月活动总结
2014/06/25 职场文书
见习报告的格式
2014/11/04 职场文书
博物馆观后感
2015/06/05 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技