nodejs之socket.io 私发消息和选择群组发消息
写在前面:其实有的时候忙碌是好的,比如忙碌起来的自己手机可以一天耗费掉只有20%的电,忙碌的自己很专心于一件事情,但是忙碌不等于过度疲劳,本周忙碌有点上脑,迷糊了一天,都在补觉,还是要去平衡下自己一天中忙碌的时数,累了就休息下,保持一个健康的身体。
今日正题:socketio实现私发消息和群组发消息(不是很困难,一搜一大片,但还是记录下来总结)
基础连接部分在上一篇:https://www.cnblogs.com/mfyngu/p/10780737.html
1.私发消息实现
实现思路:私发消息无非就是两个人之间的对话,缺少不了的是我要说啥,我要发给谁,那个谁会看到消息吗?
客户端:先显示当前在线的人-
//先找到当前在线的人
socket.on('online',function(data){
//data是一个sessionStore,包含了所有的用户信息 // 把该对象转换成哼数组
let users=Object.values(data.online);
document.getElementById('onlie').innerText=users.length;
// 做一个select进行在线列表进行 var html='';
for(var key in users){
var u=users[key];
html+=` <option value="${u.socketid}">
${u.username}
</option>
`;
}
})
选择私发给当前在线的人也就是->privateto
//私聊内容
document.getElementById("privateBtn").onclick=function(){ //获取到私聊对象
socket.emit('sendPrvate',{
msg:document.getElementById("privateMsg").value,//这个是存储要发送的消息
//向谁发
toid:privateto //存储了socketid 选择发送给某人后直接将peivateto进行赋值
})
}
发送的消息和事件已经传递到客户端了,客户端的样子
io.on('sendPrvate',(context)=>{
//socketid to msg
let {toid,msg}=context.data; //获取发送过来的信息
let fromSocket = context.socket.socket.id;//取出是谁发送的数据
let {username} = findBySocketID(fromSocket);//找到要发送给人的username :findBySocketID(fromSocket)是初始登录时记录每个人的sockteid和username
//xx对你私聊说: data={username:username,content:msg,type:'pravate'};
console.log(toid);
app._io.to(toid).emit('pravate',data); }) //这句话就是私发的关键
其中context的结构为图所示
服务端反应后将私发的信息推送到该用户的聊天中客户端只需要直接对private事件进行接收即可
//客户端响应私发消息
socket.on('pravate',function(data){
console.log(data);
var ul = document.getElementById('msg');
ul.innerHTML+=`<li><span class="img"></span>
<span class="name">${data.username}</span>
<span class="content">${data.content}</span></li>`;
})
实现截图:佛系截图(还没有美化样式)
2:群组消息的实现
(1)识别用户在哪个群组 ,向哪个群组发送消息
客户端:直接选择加入的群组,向服务端传递
服务端:
io.on('joinGroup',(context)=>{
let groupid=context.data;
context.socket.socket.join(groupid);
console.log('加入'+groupid+'组');
})
嘻嘻,加入组成功
这样客户端用户可以发送组消息:
//群聊选择
document.getElementById('groupbutton').onclick=function(){
var groupid= group;
socket.emit('sendGroup',{
msg:document.getElementById('groupMsg').value,
togroup:groupid,
})
}
服务端监听消息,并将消息推送给该组的成员
//给某个群组发消息
io.on('sendGroup',(context)=>{
console.log(context);
let {togroup,msg}= context.data;//发送的群组和消息
let fromSocket=context.socket.socket.id;//找到发送人的socketid
let {username}=findBySocketID(fromSocket);//找当前的发送人
let data = {username:username,content:msg,type:'group',grouptype:group[togroup]};
app._io.to(togroup).emit('sendGroupMsg',data);
// 组聊信息
})
这样客户端直接响应sendGroupMsg的消息就可以了,
群组发消息和私发消息已经实现
3:当前用户在线数目统计
超级简单,只需要每个用户上线的时候,对群组的用户数量+1在广播到所有用户那里
io.on('login',context => {
let id = context.data.id;
//存储现有的用户消息,存储socketid,在list页面加载知乎才存储到的
global.mySessionStore[id].socketid = context.socket.socket.id;
//测试广播在线上线用户上线
io.broadcast('online',{
online:global.mySessionStore, //发送所有的用户信息,这里也是私聊的一个关键get
})
代码code优化下进行github ;
git有风险 push需谨慎(此处加上一行泪~~)
nodejs之socket.io 私发消息和选择群组发消息的更多相关文章
- nodejs之socket.io 聊天实现
写在前面:最近很火的“996”话题,可谓是引起一片热议,马老师说:能够996应该是幸运的,996是对奋斗者的一种机遇(记得不是很清楚).996缺少的是自己的空闲时间了,当我是空闲的时候偶尔996挺好的 ...
- nodejs+express+socket.io
其实官网文档清楚了 https://socket.io/get-started/chat/ 但是因为之前写的是nodejs+express, socket.io是后加的, 还是有小坑 服务器端: 官 ...
- python脚本实现向钉钉群组发送消息
一.json格式 import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robo ...
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
上次的nodejs操作arduino入门篇中实现了如何连接arduino.这次我们来实现通过arduino测量室内温度并在浏览器上显示出来. [所需材料] 硬件:LM35温度传感器,arduino u ...
- NodeJS+Express+Socket.io的一个简单例子
关键字:NodeJS,Express,Socket.io. OS:Windows 8.1 with update pro. 1.安装NodeJS:http://nodejs.org/. 2.初始化一个 ...
- nodejs之socket.io模块——实现了websocket协议
Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,主要使用的是sock ...
- nodejs的socket.io学习笔记
socket.io学习笔记 1.服务器信息传输: 2.不分组,数据传输: 3.分组数据传输: 4.Socket.io难点大放送(暂时没有搞定): 服务器信息传输 1. // send to curre ...
- 使用nodejs引用socket.io做聊天室
Server: var app = require('http').createServer(handler) , io = require('socket.io').listen(app) , fs ...
- 使用C#开发windows服务定时发消息到钉钉群_群组简单消息
前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...
随机推荐
- html传参数 js工具类
var QueryUtils = { GetQueryString: function (name) { var reg = new RegExp("(^|&)" + na ...
- Spring MVC @RequestMapping浅析
简介:@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapp ...
- 获取host信息
QT如果要进行网络编程首先需要在.pro”中添加如下代码: QT += network 在头文件中包含相关头文件: #include <QHostInfo> #include <QN ...
- 团体程序设计天梯赛L2-009 抢红包 2017-03-22 19:18 131人阅读 评论(0) 收藏
L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢 ...
- Android 类加载器
首先需要知道的是android中两个主要的classloader,PathClassLoader和DexClassLoader,它们都继承自BaseDexClassLoader,这两个类有什么区别呢? ...
- cenos7切换阿里源
备份并安装base reop源 cd /etc/yum.repos.d sudo mv CentOS-Base.repo CentOS-Base.repo.bak 下载阿里源并配置 sudo wget ...
- delphi实现截全屏功能
procedure TForm1.Button10Click(Sender: TObject);var bmp: TBitmap; can: TCanvas; dc: HDC; Image1: TIm ...
- delphi Table切换控件顺序问题
delphi Table切换控件顺序问题 Tagorder的值就是确定Table键切换顺序的 以上做法只能解决同一类型的多个控件(如Edit1,edit2....)显示顺序问题 假如有不同类型的控件如 ...
- 清除clusternode
Import-Module FailoverClusters then clear-clusternode
- ABP架构
ABP架构 一.什么是ABP架构? ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate 基于DDD的经典分层 ...