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 Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 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获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
10款实用的PHP开源工具
2015/10/23 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
永不消失的title提示代码
2007/02/15 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python中字典和JSON互转操作实例
2015/01/19 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
详解Python3 pickle模块用法
2019/09/16 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
python中reload重载实例用法
2020/12/15 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
政府个人对照检查材料
2014/08/28 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
防汛工作情况汇报
2014/10/28 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
公司开业致辞
2015/07/29 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
LeetCode189轮转数组python示例
2022/08/05 Python