写在前面:其实有的时候忙碌是好的,比如忙碌起来的自己手机可以一天耗费掉只有20%的电,忙碌的自己很专心于一件事情,但是忙碌不等于过度疲劳,本周忙碌有点上脑,迷糊了一天,都在补觉,还是要去平衡下自己一天中忙碌的时数,累了就休息下,保持一个健康的身体。

今日正题:socketio实现私发消息和群组发消息(不是很困难,一搜一大片,但还是记录下来总结)

基础连接部分在上一篇:https://www.cnblogs.com/mfyngu/p/10780737.html

1.私发消息实现

实现思路:私发消息无非就是两个人之间的对话,缺少不了的是我要说啥,我要发给谁,那个谁会看到消息吗?

客户端:先显示当前在线的人-

  1. //先找到当前在线的人
  2. socket.on('online',function(data){
  3. //data是一个sessionStore,包含了所有的用户信息
  4.  
  5. // 把该对象转换成哼数组
  6. let users=Object.values(data.online);
  7. document.getElementById('onlie').innerText=users.length;
  8. // 做一个select进行在线列表进行
  9.  
  10. var html='';
  11. for(var key in users){
  12. var u=users[key];
  13. html+=` <option value="${u.socketid}">
  14. ${u.username}
  15. </option>
  16. `;
  17. }
    })

  选择私发给当前在线的人也就是->privateto

  1. //私聊内容
  2. document.getElementById("privateBtn").onclick=function(){
  3.  
  4. //获取到私聊对象
  5. socket.emit('sendPrvate',{
  6. msg:document.getElementById("privateMsg").value,//这个是存储要发送的消息
  7. //向谁发
  8. toid:privateto //存储了socketid 选择发送给某人后直接将peivateto进行赋值
  9. })
  10. }

  发送的消息和事件已经传递到客户端了,客户端的样子

  1. io.on('sendPrvate',(context)=>{
  2. //socketid to msg
  3. let {toid,msg}=context.data; //获取发送过来的信息
  4. let fromSocket = context.socket.socket.id;//取出是谁发送的数据
  5. let {username} = findBySocketID(fromSocket);//找到要发送给人的username :findBySocketID(fromSocket)是初始登录时记录每个人的sockteid和username
  1. //xx对你私聊说:
  2.  
  3. data={username:username,content:msg,type:'pravate'};
    console.log(toid);
    app._io.to(toid).emit('pravate',data); }) //这句话就是私发的关键

  其中context的结构为图所示

服务端反应后将私发的信息推送到该用户的聊天中客户端只需要直接对private事件进行接收即可

  1. //客户端响应私发消息
  2. socket.on('pravate',function(data){
  3. console.log(data);
  4. var ul = document.getElementById('msg');
  5. ul.innerHTML+=`<li><span class="img"></span>
  6. <span class="name">${data.username}</span>
  7. <span class="content">${data.content}</span></li>`;
  8. }) 

实现截图:佛系截图(还没有美化样式)

2:群组消息的实现

(1)识别用户在哪个群组  ,向哪个群组发送消息

客户端:直接选择加入的群组,向服务端传递

服务端:

  1. io.on('joinGroup',(context)=>{
  2. let groupid=context.data;
  3. context.socket.socket.join(groupid);
  4. console.log('加入'+groupid+'组');
  5. })

   嘻嘻,加入组成功

这样客户端用户可以发送组消息:

  1. //群聊选择
  2. document.getElementById('groupbutton').onclick=function(){
  3. var groupid= group;
  4. socket.emit('sendGroup',{
  5. msg:document.getElementById('groupMsg').value,
  6. togroup:groupid,
  7. })
  8. }

  服务端监听消息,并将消息推送给该组的成员

  1. //给某个群组发消息
  2. io.on('sendGroup',(context)=>{
  3. console.log(context);
  4. let {togroup,msg}= context.data;//发送的群组和消息
  5. let fromSocket=context.socket.socket.id;//找到发送人的socketid
  6. let {username}=findBySocketID(fromSocket);//找当前的发送人
  7. let data = {username:username,content:msg,type:'group',grouptype:group[togroup]};
  8. app._io.to(togroup).emit('sendGroupMsg',data);
  9. // 组聊信息
  10. })

  这样客户端直接响应sendGroupMsg的消息就可以了,

 群组发消息和私发消息已经实现

3:当前用户在线数目统计

超级简单,只需要每个用户上线的时候,对群组的用户数量+1在广播到所有用户那里

  1. io.on('login',context => {
  2. let id = context.data.id;
  3. //存储现有的用户消息,存储socketid,在list页面加载知乎才存储到的
  4. global.mySessionStore[id].socketid = context.socket.socket.id;
  5. //测试广播在线上线用户上线
  6. io.broadcast('online',{
  7. online:global.mySessionStore, //发送所有的用户信息,这里也是私聊的一个关键get
  8. })

  代码code优化下进行github ;

git有风险 push需谨慎(此处加上一行泪~~)

 

nodejs之socket.io 私发消息和选择群组发消息的更多相关文章

  1. nodejs之socket.io 聊天实现

    写在前面:最近很火的“996”话题,可谓是引起一片热议,马老师说:能够996应该是幸运的,996是对奋斗者的一种机遇(记得不是很清楚).996缺少的是自己的空闲时间了,当我是空闲的时候偶尔996挺好的 ...

  2. nodejs+express+socket.io

    其实官网文档清楚了  https://socket.io/get-started/chat/ 但是因为之前写的是nodejs+express, socket.io是后加的, 还是有小坑 服务器端: 官 ...

  3. python脚本实现向钉钉群组发送消息

    一.json格式 import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robo ...

  4. 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)

    上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...

  5. NodeJS+Express+Socket.io的一个简单例子

    关键字:NodeJS,Express,Socket.io. OS:Windows 8.1 with update pro. 1.安装NodeJS:http://nodejs.org/. 2.初始化一个 ...

  6. nodejs之socket.io模块——实现了websocket协议

    Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,主要使用的是sock ...

  7. nodejs的socket.io学习笔记

    socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...

  8. 使用nodejs引用socket.io做聊天室

    Server: var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs ...

  9. 使用C#开发windows服务定时发消息到钉钉群_群组简单消息

    前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...

随机推荐

  1. .NET开源MSSQL、Redis监控产品Opserver之安全配置

    简介 Opserver是Stack Overflow的开源监控解决方案,由Stack Exchange发布,基于.NET框架构建.开源地址:https://github.com/opserver/Op ...

  2. Linux内核版本

    在Linux中找到/usr/src/kernels/目录,该目录下面有一个系统内核文件 例如:2.6.32-431.11.2.el6.x86_64 Linux内核版本规则 Linux内核版本有三组数字 ...

  3. 创建Jutil (单元测试)

    如何创建JUtil 这里拿Dynamic项目来演示,首先创建一个Dynamic项目,起名,点next, 继续点next, 将web.xml文件勾选,finish, 接下来在Java Resources ...

  4. VCS简介

    VCS -Version Control System 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 特征 1.记录文件的所有历史变化 2.随时可恢复到任何一个历史状 ...

  5. Nutch2.2.1 问题一:索引不能提交

    按照bin/nutch下的脚步一步一步的执行抓取:Inject,Generate,Fetcher,Parse,Updatedb,Solrindex,SolrDump. 每部其实都可以打出 “bin/n ...

  6. C++友元(友元函数、友元类和友元成员函数)

    友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...

  7. Performance profile of a typical interior scene

    ------------------------------- Num faces: 7000k+ Num lights: 38 Num textures: 79 Textures on disk: ...

  8. win7下安装numpy

    OS: WIN7 32bit Python: 3.4 在以下网站下载: numpy-MKL-1.9.0.win32-py3.4.exe

  9. 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  10. “全栈2019”Java第十八章:一元运算符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...