Socket io处理两种不同的用户类型

时间:2017-11-17 13:49:27

标签: node.js socket.io

我有两个套接字服务器在不同的机器上运行。

// Customers
io.on('connection', function (socket) {

    socket.on(REQUEST, function (callback) {
        result = 'OK';
        callback(result);
    });
});

// Suppliers
// another socket server running on another instance

io.on('connection',function (socket) {

    socket.on(PRODUCTS, function (callback) {
        result = 'OK';
        callback(result);
    });
});

据我所知,如果我没有两台服务器之间的映射,我就无法从一台服务器发送到另一台服务器。

如何在单个套接字服务器上区分两种类型的用户。 ? (然后我们有唯一的套接字ID,不需要映射)

2 个答案:

答案 0 :(得分:1)

我不是百分百肯定我理解你的问题。如果您需要区分连接到同一套接字的不同用户,则可以使用Rooms的概念。如果需要提供不同的端点,可以使用命名空间。

我将在这里总结一下文档中的一个例子:

房间

您可以调用join来将套接字订阅到给定频道:

io.on('connection', function(socket){
  socket.join('some room'); // At user login maybe you can decide if 
                            // the user should join the customer or suppliers
                            // room, or both if you need to
});

然后在广播或发布时,只需使用 (它们是相同的):

io.to('some room').emit('some event');

要离开您呼叫的频道,请以与加入相同的方式离开。

在每个命名空间中,您还可以定义套接字可以加入和离开的任意通道。每个连接加入默认频道,对广播很有用,一旦断开连接,你的socketId将自动离开他加入的任何房间。

io.on('connection', function(socket){
  socket.on('say to someone', function(id, msg){
    // Useful to broadcast to every connected socket
    socket.broadcast.to(id).emit('my message', msg); 
  });
});

命名空间

基本上我们可以定义不同的端点,默认端点是'/'。

服务器端

启动服务器时,您可以定义许多可以访问应用程序的名称空间(端点)。所有这些都可能有不同的事件和行为

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

客户端

在客户端,您必须连接到之前声明的命名空间

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

https://socket.io/docs/rooms-and-namespaces/

答案 1 :(得分:0)

套接字连接可以采用参数,假设其user_type。在服务器端,您可以通过以下方式获取该参数:

io.connect("<>"",{path:"/socket.io",query:"user_type=<your_user_type});

在客户端,您可以启动连接,如:

{{1}}

然后你可以为不同类型的用户做任何你想做的事情。您可以将它们连接到不同的房间,或者保留一个hashmap以获取有关哪个socketid属于哪个usertype的信息