我有两个套接字服务器在不同的机器上运行。
// 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,不需要映射)
答案 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');
答案 1 :(得分:0)
套接字连接可以采用参数,假设其user_type。在服务器端,您可以通过以下方式获取该参数:
io.connect("<>"",{path:"/socket.io",query:"user_type=<your_user_type});
在客户端,您可以启动连接,如:
{{1}}
然后你可以为不同类型的用户做任何你想做的事情。您可以将它们连接到不同的房间,或者保留一个hashmap以获取有关哪个socketid属于哪个usertype的信息