2012-03-12 41 views
1

我是nodejs的新手,正在尝试socket.io。我想发送消息到特定的套接字,所以我想我会存储对套接字的引用。Socket.IO中的套接字引用

var controls = {}; 
var clients = {}; 

var control = io 
    .of("/control") 
    .on("connection", function(socket){ 
    socket.on("connect_player", function(data){ 
     var id = data.screen_id; 
     controls[socket.id] = id; 
    }); 

    socket.on("msg", function(data){ 
     id = controls[socket.id] 
     player.socket(clients[id]).emit("msg", data); 
    }); 
    }); 

var player = io 
    .of("/player") 
    .on("connection", function(socket){ 
    socket.on("set_id", function(id){ 
     clients[id] = socket.id 
    }); 
    }); 

我首先启动一个连接到“player”命名空间并显示一个id(硬编码)的网页。然后,另一个连接到与控制器名称空间相同的“控制”命名空间的网页,现在控制器应该能够向该特定播放器发送消息,但这会工作一段时间,然后失败。

在工作期间,我可以从控制页面发送消息到特定播放器页面。

在停止工作后,我查看了播放器名称空间中的套接字ID,发现套接字ID与最初的套接字ID不同。

我想我在这里做错了什么或对概念有错误的理解。我该如何解决这个问题。

编辑:

我添加监听器“重新连接”事件,发现每个“重新连接”事件之后socket.id的值发生变化。所以控件和客户端都有无效的socket.id值来表示我的问题。有没有克服这一点。

回答

4

最新socket.io支持的客房。那么这个怎么样?对于每个连接,为该连接设置一个唯一的ID(例如,唯一的用户名 - 与会话一起工作 - 或者任何你想要的)。然后你可以使用

io.on('connection', function(socket) { 
    // retrieve the ID from socket 
    socket.join('/priv/'+ID); 
}); 

然后,你可以做以下的msg处理程序:

// get the ID 
io.sockets.in('/priv/'+ID).emit("msg", data); 

在这一点上,你可以肯定的是,消息就到你想要的用户。当然,您需要确保客户端重新连接时ID不会改变。就像我之前提到的 - 这可以通过将会话cookie发送到服务器并从会话中检索ID来完成。

我认为这是唯一可接受的解决方案,因为客户端可能会重新连接很多次,并且您希望其他客户端通过例如(唯一)名称来识别此特定客户端。

+0

我编辑了我的问题。我面临的问题是由于我使用socket.id作为引用,它似乎在重新连接后会发生变化。 – Josnidhin 2012-03-12 08:58:20

+0

准确。这就是为什么我建议不使用它。对于每个客户定义和设置您自己的ID并使用房间来维护私人消息。 – freakish 2012-03-12 08:59:32

+0

根据我的经验,您应该使用RedisStore来使用“房间”功能。由于Socket.io使用Redis的订阅,取消订阅功能来实现“房间” – InspiredJW 2012-03-12 09:37:26

1

你能尝试设置心跳间隔为

io.set('heartbeat interval', 20); 
io.set('heartbeat timeout', 60); 
+0

我不认为这会帮助我。我试过了,没有任何改变。感谢您的建议。 – Josnidhin 2012-03-12 08:21:33

+0

您使用的是哪个版本的socket.io? – almypal 2012-03-12 08:56:40

+0

最新版本v0.9 – Josnidhin 2012-03-12 08:59:25

相关问题