node.js中Socket.IO的进阶使用技巧


Posted in Javascript onNovember 04, 2014

在上一篇博文Socket.IO中,我简要介绍了Socket.IO的基本使用方法并创建了一个简单的聊天室DEMO。本篇在入门篇的基础上,继续探讨Socket.IO的进阶用法。本篇将从配置、房间、事件等方面入手,介绍一些Socket.IO中实用的API和注意事项。

1. 配置

Socket.IO提供了4个配置的API:io.configure, io.set, io.enable, io.disable。其中io.set对单项进行设置,io.enable和io.disable用于单项设置布尔型的配置。io.configure可以让你对不同的生产环境(如devlopment,test等等)配置不同的参数。以下定义了development和release两种环境下Socket.IO的不同配置:

var io = require('socket.io').listen(80);
io.configure('development', function(){

    io.enable('browser client etag');

    io.set('log level', 1);

});
io.configure('release', function(){

    io.set('transports', ['websocket']);

});

下面列举一些常用的配置项,具体配置参数参见官方WIKI

1).transports(默认['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']):一个包含通信方法类型的数组。Socket.IO支持多种实现在线即时通信的方式,如websocket、polling等等,该配置能让你自行选择备用的通信方式。
2).log level(默认3):日志输出的最低级别,0为error,1为warn,2为info,3为debug,默认即输出所有类型的日志。
3).heartbeat interval(默认25秒):心跳包发送间隔,客户端需要在此时间段之内向服务器发送一个心跳包才能保持通信。

2. 房间

房间是Socket.IO提供的一个非常好用的功能。房间相当于为指定的一些客户端提供了一个命名空间,所有在房间里的广播和通信都不会影响到房间以外的客户端。

在入门篇中,我们知道socket.join('room name')可用于客户端进入房间,socket.leave('room name')用于离开房间。当客户端进入一个房间之后,可以通过以下两种方式在房间里广播消息:

//1. 向my room广播一个事件,提交者会被排除在外(即不会收到消息)

io.sockets.on('connection', function (socket) {

    //注意:和下面对比,这里是从客户端的角度来提交事件

    socket.broadcast.to('my room').emit('event_name', data);

}
//2. 向another room广播一个事件,在此房间所有客户端都会收到消息

//注意:和上面对比,这里是从服务器的角度来提交事件

io.sockets.in('another room').emit('event_name', data);
//向所有客户端广播

io.sockets.emit('event_name', data);

除了向房间广播消息之外,还可以通过以下API来获取房间的信息。

//获取所有房间的信息

//key为房间名,value为房间名对应的socket ID数组

io.sockets.manager.rooms
//获取particular room中的客户端,返回所有在此房间的socket实例

io.sockets.clients('particular room')
//通过socket.id来获取此socket进入的房间信息

io.sockets.manager.roomClients[socket.id]

3. 事件

Socket.IO内置了一些默认事件,我们在设计事件的时候应该避开默认的事件名称,并灵活运用这些默认事件。

服务器端事件:

1).io.sockets.on('connection', function(socket) {}):socket连接成功之后触发,用于初始化
socket.on('message', function(message, callback) {}):客户端通过socket.send来传送消息时触发此事件,message为传输的消息,callback是收到消息后要执行的回调
2).socket.on('anything', function(data) {}):收到任何事件时触发
3).socket.on('disconnect', function() {}):socket失去连接时触发(包括关闭浏览器,主动断开,掉线等任何断开连接的情况)

客户端事件:

1).connect:连接成功
2).connecting:正在连接
3).disconnect:断开连接
4).connect_failed:连接失败
5).error:错误发生,并且无法被其他事件类型所处理
6).message:同服务器端message事件
7).anything:同服务器端anything事件
8).reconnect_failed:重连失败
9).reconnect:成功重连
10).reconnecting:正在重连

在这里要提下客户端socket发起连接时的顺序。当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。

4. 授权

1).向所有客户端广播:socket.broadcast.emit('broadcast message');

2).进入一个房间(非常好用!相当于一个命名空间,可以对一个特定的房间广播而不影响在其他房间或不在房间的客户端):socket.join('your room name');

3).向一个房间广播消息(发送者收不到消息):socket.broadcast.to('your room name').emit('broadcast room message');

4).向一个房间广播消息(包括发送者都能收到消息)(这个API属于io.sockets):io.sockets.in('another room name').emit('broadcast room message');

5).强制使用WebSocket通信:(客户端)socket.send('hi'),(服务器)用socket.on('message', function(data){})来接收。

Socket.IO的进阶用法介绍基本就到这里。个人感觉在日常使用的时候这些基本API已经够用了,这也体现了Socket.IO极其简洁易用的设计哲学。本文只是抛砖引玉,当在实际运用中遇到解决不了的问题时,再去查看官方详细的WIKI会比较好。

Javascript 相关文章推荐
JQuery写动态树示例代码
Jul 31 Javascript
javascript中全局对象的parseInt()方法使用介绍
Dec 19 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
html文本框提示效果的示例代码
Jun 28 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 Javascript
js生成随机数的方法实例
Oct 16 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
移动设备手势事件库Touch.js使用详解
Aug 18 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
vue实现移动端项目多行文本溢出省略
Jul 29 Javascript
JavaScript实现商品评价五星好评
Nov 30 Javascript
node.js中的Socket.IO使用实例
Nov 04 #Javascript
Node.js的特点和应用场景介绍
Nov 04 #Javascript
Node.js中的模块机制学习笔记
Nov 04 #Javascript
Node.js异步I/O学习笔记
Nov 04 #Javascript
JavaScript中的ubound函数使用实例
Nov 04 #Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 #Javascript
网页中表单按回车就自动提交的问题的解决方案
Nov 03 #Javascript
You might like
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
javascript 写类方式之七
2009/07/05 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
办公室主任先进事迹
2014/01/18 职场文书
感恩节活动策划方案
2014/05/16 职场文书
团队拓展活动总结
2014/08/27 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
稽核岗位职责范本
2015/04/13 职场文书