我是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值来表示我的问题。有没有克服这一点。
我编辑了我的问题。我面临的问题是由于我使用socket.id作为引用,它似乎在重新连接后会发生变化。 – Josnidhin 2012-03-12 08:58:20
准确。这就是为什么我建议不使用它。对于每个客户定义和设置您自己的ID并使用房间来维护私人消息。 – freakish 2012-03-12 08:59:32
根据我的经验,您应该使用RedisStore来使用“房间”功能。由于Socket.io使用Redis的订阅,取消订阅功能来实现“房间” – InspiredJW 2012-03-12 09:37:26