命名空间
Socket.IO 允许命名套接字
这是一个有用的功能,可以最大限度地减少资源数量(TCP连接),同时通过在通信通道之间引入分离来分离应用程序中的问题。
默认命名空间
默认命名空间为/
,默认情况下是Socket.IO客户端及服务器的连接和监听的命名空间
以下的方法默认向所有连接到/
的socket发送消息
// the following two will emit to all the sockets connected to `/`
io.sockets.emit('hi', 'everyone');
io.emit('hi', 'everyone'); // short form
每个命名空间都会出发一个connection
事件,并将当前的socket实例作为参数传入回调函数中
io.on('connection', function(socket){
socket.on('disconnect', function(){ });
});
自定义命名空间
在服务器端调用of
函数:
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected');
});
nsp.emit('hi', 'everyone!');
在客户端指定命名空间:
var socket = io('/my-namespace');
注意:命名空间是Socket.IO协议的实现细节,与底层传输的实际URL无关
Rooms
在命名空间中,可以join
和leave
任意定义的通道
io.on('connection', function(socket){
socket.join('some room');
});
通过 to
或in
方法来对特定的通道进行广播或触发事件
io.to('some room').emit('some event');
Default Room
每一个socket在Socket.IO中,都有一个唯一标识符Socket#id
。为了便利起见,每个套接字自动加入由此id标识的Room
断开连接时,socket会自动退出其所在的Room
从外部世界发送消息
设定adapter 为socket.io-redis
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host:'localhost',port:6379 }));
然后利用 socket.io-emitter
,你可以从任何进程向任何通道发送消息
var io = require('socket.io-emitter')({ host:'127.0.0.1',port:6379 });
setInterval(function() {
io.emit('时间',新 日期);
},5000);
API
客户端始终连接到/
主命名空间,然后潜在的连接到其他命名空间
namespace.name
获取命名空间名称
namespace.connected
Socket连接到此命名空间的对象的哈希值,索引为id
namespace.adapter
用于命名空间的adapter
,在使用Adapter基于Redis的方法时很有用,因为它公开了管理集群中套接字和房间的方法。
namespace.to(room) namespace.in
namespace.emit(eventName [,... args])
向所有连接的客户端发送事件
namespace.clients(callback)
获取连接到此命名空间的客户端ID列表
namespace.use(fn)
注册一个中间件函数,为每一个传入的socket执行该函数
io.use((socket, next) => {
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});
Event: connect connection
在客户端连接时触发。
io.on('connect',(socket)=> { // ... });
io.of('/admin').on('connect', (socket) => {
// ...
});
Flag: ‘volatile’
如果客户端未准备好接收消息,则事件数据可能会丢失
io.volatile.emit('一个事件',{ some:'data' }); //客户可能会也可能不会收到它
Flag: ‘binary’
制定传输的数据是否存在二进制。指定时提升效率。
io.binary(false).emit('an event', { some: 'data' });
Flag: ‘local’
事件数据将仅广播到当前节点(使用Redis适配器时)
io.local.emit('一个事件',{ some:'data' });