socket.io emit的几种用法解释
来源:互联网 发布:备份软件下载 编辑:程序博客网 时间:2024/06/06 19:31
服务器信息传输
// send to current request socket clientsocket.emit('message', "this is a test");// sending to all clients except sendersocket.broadcast.emit('message', "this is a test");// sending to all clients in 'game' room(channel) except sendersocket.broadcast.to('game').emit('message', 'nice game');// sending to all clients, include senderio.sockets.emit('message', "this is a test");// sending to all clients in 'game' room(channel), include senderio.sockets.in('game').emit('message', 'cool game');// sending to individual socketidio.sockets.socket(socketid).emit('message', 'for your eyes only');
上述集中方式为socket.io常用的数据传输方式,
io.sockets.on('connection', function (socket) {});
回调函数的socket参数为一个 client
与服务器的连接标示,不同的 client
会有不同的连接标示。
不分组,数据传输
socket.emit
socket.emit
信息传输对象为当前socket
对应的client
,各个client socket
相互不影响。socket.broadcast.emit
socket.broadcast.emit
信息传输对象为所有client
,排除当前socket
对应的client
。io.sockets.emit
信息传输对象为所有client
。
分组数据传输
类似于之前提过的 of
方法生成命名空间来管理用户, socket.io
可以使用分组方法, socket.join()
,以及与之对应的 socket.leave()
。
io.sockets.on('connection', function (socket) { socket.on('firefox', function (data) { socket.join('firefox'); }); socket.on('chrome',function(data){ socket.join('chrome'); });});
假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作
socket.emit('firefox')
,就可以加入 firefox
聊天室; socket.emit('chrome')
,就可以加入 chrome
聊天室;
向一个分组传输消息,有两种方式:
socket.broadcast.to('chrome').emit('event_name', data); //emit to 'room' except this socket clientio.sockets.in('chrome').emit('event_name', data) //emit to all socket client in the room
broadcast
方法允许当前 socket client
不在该分组内。
可能有一个疑问,一个 socket
是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“, socket.join()
添加进去就可以了。官方提供了订阅模式的示例:
socket.on('subscribe', function(data) { socket.join(data.room);})socket.on('unsubscribe', function(data) { socket.leave(data.room); })
后台处理订阅/退订事件
socket = io.connect('http://127.0.0.1:1338/');socket.emit('subscribe',{"room" : "chrome"};socket.emit('unsubscribe',{"room" : "chrome"};
前端触发订阅/退订事件,就可以加入对应的聊天室。 通过 of
方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。
Socket.io难点大放送(暂时没有搞定)
- 授权验证
socket
连接需要添加权限验证,让已登录的用户socket
连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:
io.sockets.authorization(function (handshakeData, callback) { callback(null, true);}).
callback
函数有两个参数,第一个为 error
,第二个参数为是否授权bool值,通过授权回调函数应为 callback(null,true)
,其它情况下都为拒绝建立连接。
按照web的开发方式,检测是否登录首选 cookie-session
来实现,问题也是出在这里。 websocket
握手阶段属于 HTTP
协议,简单来说是可以读到cookie,就可以实现session。
+ 精准单用户推送
理论上来说
// sending to individual socketidio.sockets.socket(socketid).emit('message', 'for your eyes only');
就可以向一个特定用户推送消息,但是如何获得这个 socketId
,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。
- socket.io emit的几种用法解释
- [转]socket.io emit的几种用法解释
- socket.io中emit和on的用法
- socket.io中emit和on的用法
- socket.io中emit和on的用法【转】
- socket.io的emit使用清单
- socket.io broadcast的几种用法之初试
- socket.io中emit消息形式
- socket.io的基本用法
- vue中 关于$emit的用法
- Socket的几种
- socke.io.emit 方法
- 曲线拟合的几种解释
- $emit/$broadcast/$on用法
- socket.io用法与实例
- Socket的几种模式
- socket 的几种模型
- 四种IO模型的解释
- versions中添加第三方库
- HDOJ 题目1503 Advanced Fruits(LCS 递归,模板)
- mac中安装maven3.2.1
- Eclipse+Tomcat远程调试
- 排序算法---交换排序( java)
- socket.io emit的几种用法解释
- SQL 按时间统计语句
- ubuntu下允许root用户ssh远程登录
- iTunes Connect居然支持中文了!
- java中的数据类型转换
- JAVA Jdom解析XML
- Android中Preference的使用以及监听事件分析
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- view -clipsTobounds属性学习