Socket.IO API Namespace

命名空间

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

在命名空间中,可以joinleave 任意定义的通道

io.on('connection', function(socket){
  socket.join('some room');
});

通过 toin方法来对特定的通道进行广播或触发事件

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' });
原文地址:https://www.cnblogs.com/goOtter/p/10115114.html