尽管降低了复杂性和可能导致问题的潜在代码,但我仍然无法让两个用户互相聊天。
我能够向所有连接的插座发出信号,所以我已经确定这不是发出/接通结构的问题,而是;来自我处理专用套接字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时会出现问题。
答案 0 :(得分:1)
问题来自我的前端。.我希望没有人会头疼!但是这里发生了什么;当您自己挖洞时,如果您不花时间环顾四周,您通常不会意识到自己有多深。我有两个插座实例。我实例化了两者,并使用一个连接并使用另一个发送消息。如果您希望事情正常进行,那么您当然无法做到。因此,我所做的只是在其中创建了一个套接字实例,然后将套接字的引用传递到我需要它的地方(sendMessage(username,socket)getMessage(socket)
ngOnInit(
this.socket = io.connect('localhost:3600',{
reconnection: true,
reconnectionDelay: 1000,
reconnectionDelayMax : 5000,
reconnectionAttempts: Infinity});