代码之家  ›  专栏  ›  技术社区  ›  Tvde1

不同路径上的多个socket.io实例

  •  1
  • Tvde1  · 技术社区  · 8 年前

    我正在创建一个REST API,它与路由和类似的操作一起工作 /api/route/action . 但我想添加WebSocket功能。所以我希望WebSockets也可以通过URL寻址。

    我有这个代码:

    const socketio = require('socket.io');
    
    //server is a http.createServer()
    module.exports = server => {
        const io = socketio(server, { route: '/socketapi/test' );
        io.on('connection', s => { 
            s.on('a', () => s.emit('b'));
            s.emit('message', 'You connected to /test.');
        });
    
        const io2 = socketio(server, { route: '/socketapi/something_else' });
        io2.on('connection', s => { 
            s.on('z', () => s.emit('y'));
            s.emit('message', 'Hi');
        });
    };
    

    我之所以要拆分它们,是因为我不必跟踪已经使用过的事件名称,这样我就可以分离连接事件中的逻辑。

    但这似乎是不可能的。如果我有两个socket.io实例在运行,我也无法连接到任何一个。

    这是可能的,还是我必须使用一些技巧,或者客户可以发送一个事件来让我知道它想要订阅什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Willem van der Veen    8 年前

    您可以使用的内置功能 socket.io 调用命名空间以实现此行为。

    下面是一个基本示例:

    服务器端:

    const nsp = io.of('/my-namespace');
    nsp.on('connection', function(socket){
      console.log('someone connected');
    });
    nsp.emit('hi', 'everyone!');
    

    客户端:

    const socket = io('/my-namespace');
    

    现在,客户机可以发出和接收特定于命名空间的消息。通过使用名称空间,您的事件名称冲突问题将得到解决。

    推荐文章