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 相关文章推荐
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
JS实现距离上次刷新已过多少秒示例
May 23 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
Nov 09 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
Mar 17 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 jQuery
js实现移动端轮播图滑动切换
Dec 21 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中的字符串函数
2006/11/24 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
网页常用特效代码整理
2006/06/23 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
js实现随机点名器精简版
2020/06/29 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
详解Python中find()方法的使用
2015/05/18 Python
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
Python数据操作方法封装类实例
2017/06/23 Python
TensorFlow变量管理详解
2018/03/10 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
为什么会有内存对齐
2016/10/10 面试题
年会搞笑主持词
2014/03/27 职场文书
迎七一演讲稿
2014/09/12 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
SQL基础的查询语句
2021/11/11 MySQL