aardio+node.js+socket.io的emit方法实现聊天室广播群聊、组聊、私聊整理_编程教程

Admin Admin
发布:2017-07-16 10:56:40 分类:心得经验
在开发聊天室、直播、在线客服、监控、股票等在多客户端在线实时数据交互的应用中,如果客户端是自己写的,服务端可以使用aardio的HPSocket扩展库,如果客户端是各种厂商各种版本的浏览器,为了兼容各种低版本浏览器,则服务端可以考虑用aardio+node.js+socket.io模块(也可以只用node.js+socket.io,请根据项目需求、实际应用场景、开发者对语言和工具的熟悉程度选择合适的组合)。在socket.io的服务端里面,已经封装好了各种方法,可以方便地实现广播群聊(消息发到所有客户端)、组聊(消息发给指定群组的客户端)、私聊(精准发送到某个指定的客户端)功能。下面是我收集整理的一些演示例子(node.js源码),供大家参考:
io.sockets.on('connection', function (socket) { //这个socket就是发消息来的客户端对象

//回调函数的socket参数为一个 client
//与服务器的连接标示,不同的 client 会有不同的连接标示。

//第1种
//信息传输对象为当前 socket 对应的 client ,各个client socket 相互不影响。
//socket就是发消息来的客户端对象,用这个对象来发射,就是回复给发消息来的客户端
socket.emit ();

//第2种
//信息传输对象为所有 client ,排除当前socket 对应的 client
//socket就是发消息来的客户端对象,用这个对象加上broadcast来发射,就是群发给除此客户端外的其它所有客户端
socket.broadcast.emit

//第3种
//信息传输对象为所有 client
//io.sockets为服务端管理的所有客户端集合,用这个集合来发发射,就是用此列表里的每个客户端对象发送,即发给所有客户端
//io.sockets.emit()

//假设有两个聊天室,一个名为firefox,另一个为chrome

//第4种
//socket是发消息来的客户端对象,用join()方法让它订阅指定房间,可以订阅多个房间(相当于可以加入多个QQ群)
socket.join('firefox'); //如 socket.on('subscribe', function(data) { socket.join(data.room); })
socket.join('chrome');//如 io.on('connection', function(socket){ socket.join('some room'); });
socket.emit('subscribe',{"room" : "chrome"};//用subscribe指令也可以订阅指定房间

//socket是发消息来的客户端对象,用leave()方法让它取消订阅指定房间
socket.leave('firefox'); //如 socket.on('unsubscribe', function(data) { socket.join(data.room); })
socket.leave('chrome');
socket.emit('unsubscribe',{"room" : "chrome"};//用unsubscribe指令也可以取消订阅指定房间

//向名为chrome的房间里除发消息,排除发送方
socket.broadcast.to('chrome').emit('event_name', data);//event_name是事件名称,指令头
io.to('some room').emit('some event');//在房间里广播消息
io.in('some room').emit('some event');//在房间里广播消息

//向名为chrome的房间里所有客户端发送消息,包含发消息来的这个客户端
io.sockets.in('chrome').emit('event_name', data);//event_name是事件名称,指令头

//向指定socketid的客户端发送私聊消息,新版已经不用这种写法了
//io.sockets.socket(socketid).emit('message', 'for your eyes only');//

//私聊,socket是发消息来的客户端对象, socket.to(对方id).emit() 发消息给指定id的客户端
socket.on('say to someone', function(id, msg){
socket.broadcast.to(接收方的socket对象的id).emit('my message', msg);//加broadcast是排除发送方
});

});
还有一些是别人整理的,备用:
  // 发送给当前客户端
socket.emit('hello', 'can you hear me?', 1, 2, 'abc');

// 发送给所有客户端,除了发送者
socket.broadcast.emit('broadcast', 'hello friends!');//加broadcast是排除发送方

// 发送给同在 'game' 房间的所有客户端,除了发送者 (不用broadcast也能排除发送者?)
socket.to('game').emit('nice game', "let's play a game");

// 发送给同在 'game1' 或 'game2' 房间的所有客户端,除了发送者 (不用broadcast也能排除发送者?)
socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");

// 发送给同在 'game' 房间的所有客户端,包括发送者
io.in('game').emit('big-announcement', 'the game will start soon');

// 发送给同在 'myNamespace' 命名空间下的所有客户端,包括发送者
io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon');

// 发送给指定 socketid 的客户端(私密消息)
socket.to().emit('hey', 'I just met you');

// 包含回执的消息
socket.emit('question', 'do you think so?', function (answer) {});

// 不压缩,直接发送
socket.compress(false).emit('uncompressed', "that's rough");

// 如果客户端还不能接收消息,那么消息可能丢失
socket.volatile.emit('maybe', 'do you really need it?');

// 发送给当前 node 实例下的所有客户端(在使用多个 node 实例的情况下)
io.local.emit('hi', 'my lovely babies');
注意,在自定义事件时,不要与系统内部保留的事件名冲突:

服务端内置保留的事件名
error    //错误事件
connect      //连接
disconnect    //断开
disconnecting   //断开中
newListener      //新监听器
removeListener    //移除监听器
ping         
pong    

客户端内置保留的事件名
connect – 当成功连接时Emitted
disconnect – 当连接断开Emitted
error – 发送错误时Emitted
reconnect – 当开始重连时Emitted
reconnectAttempt – 当尝试重连时Emitted

部分内容未经测试,不保证参考资料的准确性,socket.io新版本可能有所变动,请自行鉴别使用。
[ 发单/接单 ]
换IP投票软件
PC蛋蛋自动挂机投注
新浪微博发微博显示尾巴的方法,比如显示来自iphone 7
百度文库批量自动上传软件
一点资讯app刷阅读量/评论/收藏/订阅功能/手机号注册
定做一个阿迪达斯官网注册器(需要破点击文字式验证码)
定制人人网自动注册/修改资料/采集/私聊软件
酷狗繁星直播网页协yi
YY多功能刷订阅刷粉丝
滑块验证码本地识别
狼人杀POST QQ登录注册 获取金币数量
做个贴吧发发帖的软件懂的来
今日头条账号保存cookie
抖音粉丝软件定做,只要粉丝
百家号自媒体发文软件定制
哔哩哔哩播放量
读取TB某个商品上架时间和相关信息
网易博客软件定制
定制天涯论坛发帖软件
定制今日头条批量自动发私信软件
[ 站内搜索 ]
[ 最近热帖 ]
万能助手 -- 扩展库大全集 13757
用aardio创建web工程图文讲解(1) 12849
电脑编程入门自学:Fiddler https 抓包时提示创建根证书不成功问题彻底解决(https插件dll方式) 11748
aardio绘图演示 11416
通过chrome.dll中间件控制外部chrome浏览器 10132
我常用的aardio技巧 9781
《边学C语言边赚钱——简码编程入门教程》系列集合 9620
aardio使用http或whttp进行get/post请求时经常cookies失效怎么办?__电脑计算机编程入门教程自学 9324
[源码下载]简码视频加密解密播放工具个人版v1.0发布,永久免费开源的知识变现神器 8559
python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 8053
编程入门教程:aardio批量上传文件并显示进度条 7889
aardio调用nodejs的ws模块做一个简单的聊天通信示例 7042
电脑计算机编程入门教程自学:原生JavaScript判断字符是否为A-Za-z英文字母 6911
电脑计算机编程入门教程自学:腾讯tx或极验geetest滑块按住拖动完成拼图验证成功破解思路及源码 6506
乐玩插件AARDIO调用 6092
[ 近期热答 ]
电脑计算机编程入门教程自学:什么是buffer缓冲区? 1
aardio_代码编辑框书签管理器开源 1
aardio_怎么用ide库从代码编辑框中取出指定行的源码? 1
aardio_codepage代码页编码乱码暴力猜解工具 1
aardio内嵌echarts图表添加鼠标事件响应功能 2
aardio列表框listbox_模糊查找和精确查找 1
8亿QQ绑定手机泄露:通过腾讯QQ号查询QQ绑定的手机号码漏洞! 1
carl listviewex调用例子----------源码搬运工 2
Aardio内嵌Electron浏览框怎么正确添加启动参数? 1
Aardio取汉字的字节数或字符数 1
怎么实现mssql图片数据的读写 2
aardio_从49个数字里选六个和值为150的不重复的数字 1
在嵌入wps的时候,多了一个 透明的边框,这个怎么消除它 1
万能助手入门帮助教程:学会科学地管理工作文件 1
Aaardio开发内嵌Electron浏览框放服务器上无法下载组件的解决办法 1