【发布时间】:2019-03-29 03:23:42
【问题描述】:
尽管降低了复杂性和可能导致问题的潜在代码,但我无法让两个用户互相聊天。
我能够发射到所有连接的套接字,所以我已经确定这不是发射/开启结构上下文中的问题,而是;来自我处理私有套接字 id 的方式。
我尝试了各种版本的尝试将私人消息发送到正确的套接字 ID;我尝试过较旧的方法,例如 socket.to 和文档中的当前方法,即 io.to(sockid).emit('event' message);所有这些变化都无法帮助我。我通过打印 console.log('THIS IS MY SOCKET '+this.socket.id) 并使用 redis-cli 将它与我在 Redis 中的值进行比较,从而消除了我在 Angular 客户端上的套接字 ID,它们都每次都完美匹配,这不会给我太多继续。
问题出现在这里:
if (res === 1) {
_active_users.get_client_key(recipient)
.then(socket_id => {
console.log('======='+io.sockets.name)
console.log('I am sending the message to: '+ recipient + 'and my socket id is'+ socket_id)
// socket.to(socket_id)socket.emit('incoming', "this is top secret"
io.of('/chat').to(socket_id).emit('incoming', "this is top secret")
})
.catch(error => {
console.log("COULD NOT RETRIEVE KEY: " + error)
})
以下是包含更多上下文的 pastebin 的链接:
https://pastebin.com/fYPJSnWW
我导入的类本质上只是用于处理套接字 id 的 setter 和 getter,您可以将它们视为处理 Redis 操作的工作类。
预期:允许两个客户端仅基于其套接字 ID 进行通信。
实际: 能够向所有连接的套接字发出并接收预期的结果,但是当尝试从未知原因发送到特定的套接字 id 时会出现问题。
【问题讨论】:
-
您是否尝试将每个部分放在一行中,然后对其进行调试以查看已设置的内容和未设置的内容? IE。
var ofchat = io.of('/chat');然后var touser = ofchat.to(socket_id);然后touser.emit('blah', "blah");另外请在你的行尾添加分号,如果我出于某种原因看不到它们,我会畏缩 -
在此页面中
https://socket.io/docs/我看到他们将socket.emit('request', /* */); // emit an event to the socket用于单个套接字,将io.emit('broadcast', /* */); // emit an event to all connected sockets用于所有套接字。然后socket.on('reply', function(){ /* */ }); // listen to the event -
我有更新;我知道问题出在哪里,这有帮助 - 我的 Angular 应用程序或浏览器打开了 3 个左右的连接,导致不同的套接字 id。我不知道为什么会这样,因为在这些场景中我没有刷新页面或任何内容,所以仍在尝试解决这个问题。
-
stackabuse.com/using-global-variables-in-node-js 尝试创建一个全局变量数组,在其中推送所有创建的套接字
var touser = ofchat.to(socket_id);,将所有这些添加到数组中。你可以为每个var arrItem = new { id: socket_id, socket: ofchat.to(socket_id) };设置一个你知道的自定义ID -
虽然套接字 id 是可变的,但它并不能解决多连接问题;它需要以某种方式强制执行,以创建一些静态的东西来识别。