服务器信息传输
// send to current request socket client
socket.emit('message', "this is a test");
// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");
// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');
// sending to all clients, include sender
io.sockets.emit('message', "this is a test");
// sending to all clients in 'game' room(channel), include sender
io.sockets.in('game').emit('message', 'cool game');
// sending to individual socketid
io.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 client
io.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 socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');
就可以向一个特定用户推送消息,但是如何获得这个socketId
,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。
由于我将Express框架和socket.io库两个进程,而且没有使用redis共享数据,所以暂时不能做到session
读取,大概5天后补上。
相关推荐
真心佩服那些可以经常发布笔记的人,其实我也想经常发来的,奈何技术不够加上懒,要向大神们多多学习了,前段时间有用bomb平台自带的socket写一个聊天室,其实基本就是改了改它的demo,这次想实现一个随机私聊,所以...
Java网络编程---IO部分学习笔记整理 .doc Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三...
javaSE基础汇总学习笔记整理,javaSE基础、面向对象、IO、反射、常用的类、正则、Socket基础编程等
J2SE学习实例 1、Java的基础知识 2、Java面向对象 3、集合Collection的使用 4、IO使用 5、Socket编程 6、Thread线程技术 7、Subject反射技术 8、GUI图形编程
socket server源码@Netty 笔记 1. 内蒂 网络应用框架 特征 设计 支持多种传输类型 事件模型 高度可定制的线程模型 表现 高吞吐量,低延迟 更少的资源消耗 最小化内存拷贝 安全SSL/TLS 支持 建筑学 核 事件模型 通用...
Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,指令 subclass n.子类 ['sʌbklɑ:s]' (supertype 父类) switch (关键字) 选择语句。...
进入jschat目录并通过运行以下命令安装依赖项: npm install (依赖项:express,socket.io,sqlite3) 启动聊天服务器,运行npm start 将您的浏览器定向到localhost:3000 。 如果要使用非本地主机,请在/public/...
学习JavaSE做的一些笔记,包括Java基础知识(关键字,语句,常量,变量,运算符,数组,方法),Java面向对象(static,final,封装,继承,多态,内部类等)以及JavaAPI(String,正则,集合,映射,IO,Socket,反射,线程等技术)
2. 用 epoll 事件检测技术实现 IO 多路复用,提高运行效率; 3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责...
用于存放学习java网络编程过程遇见的重难点笔记和相关代码 附带代码大部分是《java网络编程 第四版》的课程代码 对运算字符串进行识别的作业 @since2020.11.26 IO流 - 多线程 @since2020.11.26 internet地址 @since...
实时使用socket.io。 该服务器可以处理大量用户。 使用开源HTML,NodeJS设计的代码 易于编辑,无需对编码了解太多 尽量减少使用插件和模块,以避免影响页面加载速度。 清除代码,确保没有恶意代码。 该代码简单,...
价值一万八的中美 IT 培训笔记一万多培训费的资料,北京权威的.NET培训机构】 【认真学习后你一定能成为优秀的.net程序员】 学习对象:1.大专及大专以上理工科学历,或有相当学历的理工科教育背景 2.热爱...
学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、文件的操作和程序集的相关概念,学习反射和属性。 第二阶段教学内容安排(400课时) 课程名称 课程内容 培训目的 ASP.Net2.0、ADO.Net2.0和...
学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、文件的操作和程序集的相关概念,学习反射和属性。 第二阶段教学内容安排(400课时) 课程名称 课程内容 培训目的 ASP.Net2.0、ADO.Net2.0和...
Node.js教程目录 Node.js API及常用第三方模块 Node.js基础应用 Express及其他服务器框架 Node.js操作数据库 MongoDB基础 MySql基础 Redis基础 会话与令牌 插座 其他 其他教程和笔记
ASP.NET培训资料(笔记版)(AJAX,C#,JavaScript,SQL) 详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 <br>(注明:不是...
C#,JavaScript,SQL) <br>我将不定期发布,直至所有课程完毕 <br>详细的资料 三个月的课程录像+资料笔记(花了一万六千块的培训资料超值【19G的经典内容】 认真学习后包你能成为优秀的.net程序员 ...
同时附赠一份我学习的资料,是github上的一位大神写的,非常棒的笔记,力荐!总结了Java知识、IO、http、socket、redis、git、docker,设计层次比较全,大家可以下载看看,注意文档格式是markdown的。
大四学期复习Java基础所产生的代码笔记,着重回顾了字符串、IO、线程以及socket套接字编程,在每一分代码中都附带了自己编程时的一些认识、笔记。适合Java基础不够踏实的童鞋。
java的测试项目,可以看做是java的ApiDemo,主要用于学习,也经常用来测试极光,七牛等服务器api, 实际上有什么好代码都可以加进来,直到这个工程不堪其重 目录: 目录 [java高级] [Ayo库] 集合 ConcurrentMap原理...