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需谨慎(此处加上一行泪~~)

 

原文地址:https://www.cnblogs.com/mfyngu/p/10786279.html

时间: 2024-08-24 05:48:51

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

zimbra用zmprov命令创建群组并授权向群组发邮件

zmprov工具能够执行许多任务,比如创建账号,别名,域名,COS,列表和日历等 对邮件管理员来说,在日常工作方面,zmporv是一个在CLI(command line interface)下强有力的工具,当然你也可以在管理员控制台执行这些操作 //邮件环境 系统centos6.4,zimbra7 zimbra正常工作,域名使用zijian.com 建立测试用户有user1,user2,user3,...user10 //群组信息查看 1.查看某个域名下所有群组(getAlldistributi

nodejs 基于socket.io实现聊天室

由于之后要做的网页视频直播项目要用到socket.io模块,所以特地花时间研究了下,参照网上的代码做了些改进,自己写了个聊天室代码.不得不承认后端事实推送能力有点厉害,这是以前我用php一直苦恼的事情.下面简单介绍下我的项目,顺带讲解下nodejs. 事实上,在看别人写的代码之前,我一直不知道nodejs是干嘛的,直到真正接触到才明白这也可以算作是服务端代码,丰富的第三方库使其功能极其强大.它可以像golang的beego一样直接通过命令行开启服务器,不过要用到express模块.加载模块的方式

[Nodejs]利用Socket.IO配合Express4搭建即时聊天

Socket.IO为WebSockets这个较新的web技术提供了必要的支持,包含客户端与服务端模块,以便建立通信通道,当然也可作为中间件而存在. 1 创建一个express项目 ????????? ????? 防工具盗链抓取[如果显示此文字,代表来自第三方转发] freddon所有 ??? ??????????? 可以使用命令行初始化一个express项目 先安装express npm install express npm install express-generator express 

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

初始化一个NodeJS web应用: 打开CMD窗口. 运行cmd:"mkdir myapp",新建一个文件夹,名为myapp. 运行cmd:"cd myapp",切换到文件夹myapp. 运行cmd:"npm init",创建文件package.json. 3.Express入门应用: 在上面的CMD窗口运行cmd:"npm install express --save", 安装"express" nod

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

Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,这里主要使用的是socket.io 1.服务端: 1)首先安装socket.io npm  install  socket.io 2)server.js var app = require('http').createServer(handler), io = require('socket.io').listen(a

java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码

博文来源:http://www.fhadmin.org/webnewsdetail4.html 系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM 普通java web(非maven, 附赠pom.xml文件)  数据库:mysql 3.开发工具:myeclipse  eclipse idea 均可, 没有限制. 我这边myeclipse 2014

基于socket.io的实时消息推送

用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化,如果没有来自客户端的请求,用户就不会看到这些变化. 这种模式是不适合某些应用场景的,比如在社交网络用户需要近乎实时地知道其他用户最新的信息.对于普通站点来说, 请求-响应模式可以满足绝大多数的功能需求,但总有某些功能我们希望能够为用户提供实时消息的体验. 为解决这个问题,有两种方案可以选择: 仍旧使

使用node.js + socket.io + redis实现基本的聊天室场景

在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对之前的一篇文章使用socket.io+redis来实现基本的聊天室应用场景的详细补充. 关于redis的详细情况, 请参考Redis数据库及其基本操作. 对于redis的前提是redis-server一直在运行, 这里就使用默认的localhost:6379. node.js连接redis-serv

socket.io实践(一.实现简单的图表推送)

引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器.但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素. 研究本例主要为后期BI软件,CRM图标系统使用nodejs socket做铺垫.主要实现的是一个分析表图的推送. socketio.io 代码库以及官网 https://github.com/socketio/socket.io http://socket.io/ 使用redis来实现集群读写 消息 (采用订