gpt4 book ai didi

node.js - Socket.IO 中的套接字引用

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:24 26 4
gpt4 key购买 nike

我是nodejs新手,正在尝试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 的“control”命名空间,现在 Controller 应该能够向该特定玩家发送消息,但这会工作一段时间然后失败。

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

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

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

编辑:

我添加了“重新连接”事件的监听器,发现每次“重新连接”事件后,socket.id 的值都会发生变化。因此控件和客户端具有无效的 socket.id 值,这导致了我的问题。有没有办法克服这个问题。

最佳答案

最新的socket.io支持房间。那么这个怎么样呢?对于每个连接,为此连接设置一个唯一的 ID(例如唯一的用户名 - 这与 session 配合使用效果很好 - 或您想要的任何内容)。然后就可以使用

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不会改变。就像我之前提到的 - 这可以通过将 session cookie 发送到服务器并从 session 中检索 ID 来完成。

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

关于node.js - Socket.IO 中的套接字引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com