2012-11-21 267 views
3

我想通过从保存所有数据的常规数据结构切换到使用redis以及集群来使我的socket.io应用程序扩展。但是,我遇到了一些问题,因为在当前实现的某个时刻,我将套接字对象与其他属性一起存储在此数据结构data[socket.id].socket = socket中,因为在我的应用程序中有时需要执行data[someId].socket.disconnect()来手动断开套接字。Socket.io断开连接和redis

我知道我不能直接将对象存储到redis中,所以我尝试使用JSON.stringify(socket)没有成功,因为socket是循环的。是否有另一种方法只使用id断开套接字?这样我可以存储id像这样data[socket.id].id = socket.id也许叫它data[someId].id.disconnect()什么的。所以基本上我正在寻找一种方法来断开套接字而无需访问实际套接字对象(我可以访问io对象)。

谢谢大家的帮助。

回答

2

看来,这已经完成,但没有记录任何地方......无论在io.sockets.clients(someId)获取Socket对象实例什么它叫,所以唯一的事情需要的是使用io.sockets.clients(someId).disconnect(),并且实际上将断开与客户端的连接,而不管其连接到哪个实例。我将它们存储在我自己的阵列上,而不需要。

+0

,无论实例如何,你的意思是,你正在使用RedisStore集群作为socket.io的存储吧?这仍然有效吗?也someId是socket.id? –

+1

@RanaDeep yep,在一台多核机器上使用群集,所以我产生了几个应用程序的工作人员,并且可以断开与工作人员1连接的套接字,从工作人员5中断开。 – scanales

0

我做类似的事情是这样的:

var connTable = {}; 
function onConnection(socket) { 
    connTable[socket.id] = socket; 

    socket.on("close", function(data, callback) { 
    socket.disconnect(); 
    onDisconnect(socket.id); 
    }); 


    socket.on('disconnect', function(){ 
    onDisconnect(socket.id); 
    }); 
} 

function manuallyDisconnect(socket_id) { 
    connTable[socket_id].disconnect(); 
} 

function onDisconnect() { 
    //closing process, or something.... 
} 
+0

是的,但如果您有多个节点正在运行,您将如何执行此操作? 'connTable'不能从不同的实例访问,这就是为什么我要切换到redis,并且redis不允许将循环对象('socket')序列化并存储在其中。 – scanales

+0

我明白了。呃,我在想... – wf9a5m75

+1

它似乎已经做了,但没有记录在任何地方......'io.sockets.clients(someId)'获取套接字对象,不管它在哪个实例上被称为 – scanales