zoukankan      html  css  js  c++  java
  • 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' });
    
  • 相关阅读:
    UVa 11572
    Codeforces Round #500 (Div. 2) C.Photo of The Sky
    C++中的1LL
    Codeforces Round #500 (Div. 2) ABC
    UVA11054 Wine trading in Gergovia
    UVA 11134 Fabled Rooks (贪心)
    uva1152
    牛客网暑期ACM多校训练营(第一场)A Monotonic Matrix(数学公式+思维)
    牛客网暑期ACM多校训练营(第三场)A.PACM Team(多重01背包)
    普通平衡树
  • 原文地址:https://www.cnblogs.com/goOtter/p/10115114.html
Copyright © 2011-2022 走看看