Node.js 套接字io处理两种不同的用户类型

Node.js 套接字io处理两种不同的用户类型,node.js,socket.io,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

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

// 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,不需要映射)

我不能100%肯定我理解了您的问题。如果需要区分连接到同一插座的不同用户,可以使用房间的概念。如果需要提供不同的端点,可以使用名称空间

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

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

io.on('connection',函数(socket){
socket.join('some room');//在用户登录时,您可以决定
//用户应加入客户或供应商
//房间,如果需要的话,两个都可以
});
然后,在广播或发射时,只需使用中的(两者相同):

io.to('some room')。emit('some event');
要离开一个频道,请以与加入相同的方式呼叫“离开”

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

io.on('connection',函数(socket){
socket.on('say to someone',函数(id,msg){
//用于向每个连接的套接字广播
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');

套接字连接可能采用一个参数,假定其用户类型。在服务器端,您可以通过以下方式获取该参数:

io.sockets.on('connection', function (socket) {
    var user_type =socket.handshake.query.user_type;
}
在客户端,您可以启动连接,如:

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

io.connect(“,{path:/socket.io”,query:“user\u type=一切都是一对一的数据传输。但是我需要验证不同类型用户的套接字事件。根据用户类型,我有逻辑。如果我想向特定用户(其他命名空间用户)发送事件,我不喜欢简单地检查events.inside命名空间内的用户类型.我该怎么做?io.to(conId.emit('someEvent',data)?我需要定义名称空间吗?我明白了,在这种情况下,我可能会选择房间。用户登录后,您必须让他加入客户或供应商房间,然后他将向套接字发送通用事件,并向客户房间发送特定于客户的事件。供应商也需要这样做。但您必须检查用户类型以决定使用哪种类型h要加入的房间。为什么要再次加入房间?在名称空间中,我们可以为每种类型的用户定义事件并验证onconnection。如果我了解您的要求,您可以在名称空间或房间之间进行选择,我个人会选择房间,以便只有一个端点,并且能够分配给同一用户(即管理员)客户和供应商的事件只需让这些用户加入两个房间即可。您也可以通过两个端点(名称空间)实现这一点我还没有尝试第二个选项。依赖客户端用户类型是不安全的,建议使用。我真的不知道您所说的用户类型是什么意思。我只建议传递一个参数。也许您可以从客户端传递一个令牌来验证用户,并使用该令牌获取相关信息。是的,这样我们可以获取用户类型。如何验证每个事件?一些事件只属于用户类型1,而另一些则属于用户类型2。我不喜欢在每个事件中检查用户类型的想法。这就是为什么要求通用设置进行区分?