【问题标题】:Unable to send private message to target socket id无法向目标套接字 ID 发送私人消息
【发布时间】: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 是可变的,但它并不能解决多连接问题;它需要以某种方式强制执行,以创建一些静态的东西来识别。

标签: node.js socket.io


【解决方案1】:

问题来自我的前端。我希望没有人像这样头疼!但这就是发生的事情;当你在挖自己的坑时,如果你不花时间环顾四周,你往往不会意识到自己有多深。我有两个套接字实例。我实例化了两者并使用一个连接和另一个发送消息;如果你想让事情正常工作,你当然不能这样做。所以我所做的只是在其中创建了一个套接字实例,并将该套接字的引用传递到我需要它的地方,即( sendMessage(username, socket) getMessage(socket)

 ngOnInit(     

this.socket = io.connect('localhost:3600',{
      reconnection: true,
      reconnectionDelay: 1000,
      reconnectionDelayMax : 5000,
      reconnectionAttempts: Infinity}); 

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2020-12-05
    • 2012-09-21
    • 2014-11-20
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多