nodejs的socket.io学习笔记
socket.io学习笔记
1。服务器信息传输;
2。不分组,数据传输;
3。分组数据传输;
4。Socket.io难点大放送(暂时没有搞定);
服务器信息传输
1. // send to current request socket client
2. socket.emit('message', "this is a test");
3. // sending to all clients except sender
4. socket.broadcast.emit('message', "this is a test");
5. // sending to all clients in 'game' room(channel) except sender
6. socket.broadcast.to('game').emit('message', 'nice game');
7. // sending to all clients, include sender
8. io.sockets.emit('message', "this is a test");
9. // sending to all clients in 'game' room(channel), include sender
10. io.sockets.in('game').emit('message', 'cool game');
11. // sending to individual socketid
12. io.sockets.socket(socketid).emit('message', 'for your eyes only');
上述集中方式为socket.io常用的数据传输方式,
1. io.sockets.on('connection', function (socket) {
2. });
回调函数的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()。
1. io.sockets.on('connection', function (socket) {
2. socket.on('firefox', function (data) {
3. socket.join('firefox');
4. });
5. socket.on('chrome',function(data){
6. socket.join('chrome');
7. });
8. });
假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作
socket.emit('firefox'),就可以加入firefox聊天室;
socket.emit('chrome'),就可以加入chrome聊天室;
向一个分组传输消息,有两种方式:
1. socket.broadcast.to('chrome').emit('event_name', data);
2. //emit to 'room' except this socket client
3. io.sockets.in('chrome').emit('event_name', data)
4. //emit to all socket client in the room
broadcast方法允许当前socket client不在该分组内。
可能有一个疑问,一个socket是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“,socket.join()添加进去就可以了。官方提供了订阅模式的示例:
1. socket.on('subscribe', function(data) {
2. socket.join(data.room);
3. })
4. socket.on('unsubscribe', function(data) {
5. socket.leave(data.room);
6. })
后台处理订阅/退订事件
1. socket = io.connect('http://127.0.0.1:1338/');
2. socket.emit('subscribe',{"room" : "chrome"};
3. socket.emit('unsubscribe',{"room" : "chrome"};
前端触发订阅/退订事件,就可以加入对应的聊天室。 通过of方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。
Socket.io难点
● 授权验证
socket连接需要添加权限验证,让已登录的用户socket连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:
1. io.sockets.authorization(function (handshakeData, callback) {
2. callback(null, true);
3. }).
callback函数有两个参数,第一个为error,第二个参数为是否授权bool值,通过授权回调函数应为callback(null,true),其它情况下都为拒绝建立连接。
按照web的开发方式,检测是否登录首选cookie-session来实现,问题也是出在这里。websocket握手阶段属于HTTP协议,简单来说是可以读到cookie,就可以实现session。
精准单用户推送
理论上来说
1. // sending to individual socketid
2. io.sockets.socket(socketid).emit('message', 'for your eyes only');
就可以向一个特定用户推送消息,但是如何获得这个socketId,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。
由于我将Express框架和socket.io库两个进程,而且没有使用redis共享数据,所以暂时不能做到session读取,后续补上。
nodejs的socket.io学习笔记的更多相关文章
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- nodejs之socket.io 聊天实现
写在前面:最近很火的“996”话题,可谓是引起一片热议,马老师说:能够996应该是幸运的,996是对奋斗者的一种机遇(记得不是很清楚).996缺少的是自己的空闲时间了,当我是空闲的时候偶尔996挺好的 ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- Java IO学习笔记五:BIO到NIO
作者:Grey 原文地址: Java IO学习笔记五:BIO到NIO 准备环境 准备一个CentOS7的Linux实例: 实例的IP: 192.168.205.138 我们这次实验的目的就是直观感受一 ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
随机推荐
- 网络CCNA基础了解
关于网络 CCNA.CCNP.CCIE 中的 CCNA 一.逻辑与.或.非 AND --> "与"计算 1 AND 1 = 1(取严) 1 AND 0 = 0 0 AND 1 ...
- iOS 发送位置消息
发送地理位置在社交应用里面是很常用的需求.最近也需要在自己的应用里面加入这个功能 首先我们需要获取自己的地理位置,这里用到 CLLocationManager 这个类,调用如下代码 locationM ...
- dynamics crm 365 附件上传图片并且显示。
参考了几篇博客做的: 新增websource文件(html): <!DOCTYPE html> <html> <head> <title>注释</ ...
- PyCharm 通过Github和Git上管理代码
1.最近希望通过github来管理代码,记录下pycharm上的设置,以下是针对windows版本.mac版本略有却别 如图所示 file-settings-Version Control-GitHu ...
- 分分钟钟学会Python - 数据类型(list、tuple)
第四节 数据类型(列表.元祖) 今日内容 列表 元祖 1.列表 1.格式 users = ["ji",1,3,"gyhj"] 2.公共方法 1.len #计算长 ...
- linux下普通用户添加 sudo 免密码
在使用普通用户登录的时候,会经常使用sudo指令执行一些操作,有时候感觉输入密码比较繁琐,特别是需要设置一些开机启动的时候操作,而这些操作往往就需要sudo指令,如果没有免密的话,在使用普通用户登录的 ...
- nginx应用
windows: 启动:start nginx 退出:nginx -s quit 检查配置是否正确:nginx -t -c ./conf/nginx.conf 查看是否在运行:tasklist /fi ...
- 记一次简单的关于SimpleDateFormat的优化
# 有一个有趣的需求: (1)预先定义每天24小时不同时间段的电价 (2) 有一个list<map<timestamp,value>>: timestamp(时间戳):valu ...
- word-wrap和word-break的区别吗?
word-wrap: css的 word-wrap 属性用来标明是否允许浏览器在单词内进行断句,这是为了防止当一个字符串太长而找不到它的自然断句点时产生溢出现象. word-break: css的 w ...
- xmanager连接redhat(centos)
1.以连接Centos6.5为例,先关闭防火墙 service iptables stop chkconfig --level 345 iptables off 2.安装XDM,通过 XDMCP 支持 ...