当前位置:主页 > nodejs教程 > node.js中Socket.IO的进阶使用技巧

node.js中Socket.IO的技巧分享

发布:2020-02-03 10:44:53 182


我们帮大家精选了node.js相关的编程文章,网友阚承业根据主题投稿了本篇教程内容,涉及到node.js、Socket.IO、node.js中Socket.IO的进阶使用技巧相关内容,已被575网友关注,涉猎到的知识点内容可以在下方电子书获得。

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

在上一篇博文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会比较好。


参考资料

相关文章

  • node.js回调函数之阻塞调用与非阻塞调用

    发布:2022-12-03

    给大家整理了关于node.js的教程,本文重点给大家介绍node.js回调函数之阻塞调用和非阻塞调用,涉及到node.js回调函数的相关知识,对本文感兴趣的朋友一起学习吧


  • node.js中的buffer.toString用法详解

    发布:2020-02-02

    这篇文章主要介绍了node.js中的buffer.toString方法使用说明,本文介绍了buffer.toString的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下


  • Node.js使用AngularJS的方法总结

    发布:2019-07-30

    这篇文章主要介绍了Node.js 使用AngularJS的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • Node.js中关于服务器端应用开发框架Hapi.js的用法实例

    发布:2020-06-14

    Hapi.js 是一个用来构建基于 Node.js 的应用和服务的富框架,使得开发者把重点放在便携可重用的应用逻辑而不是构建架构。内建输入验证、缓存、认证和其他 Web 应用开发常用的功能。


  • Node.js服务器作为api服务器的解决方案

    发布:2019-11-27

    本篇文章主要介绍了详解本地Node.js服务器作为api服务器的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。


  • Node.js开发命令行工具的实操方法

    发布:2019-12-03

    追求更高的效率是码农不断的追求。选择合适的工具,合理搭配使用,既能提高一部分开发效率,又能改善写代码时的心情。使用Node.js开发命令行工具是开发者应该掌握的一项技能,适当编写


  • 实例分享Node.js如何利用debug模块打印出调试日志

    发布:2020-02-18

    debug日志打印模块主要实现功能是带命名空间(模块名)、时间戳、色彩输出日志;将日志写入文件;浏览器端使用;格式化函数;支持自定义方法。下面这篇文章主要介绍了Node.js利用debug模块


  • node.js微信授权获取用户信息

    发布:2020-03-11

    这篇文章主要介绍了node.js实现微信开发之获取用户授权,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


网友讨论