当前位置: 首页 > 知识库问答 >
问题:

当套接字重新连接时,如何让socket.io服务器向特定套接字重新发送消息?

丁沛
2023-03-14

我的服务器代码使用io.to(socketId).emit('xxx');将消息发送到特定的套接字,请参阅https://socket.io/docs/emit-cheatsheet/

但是,当连接坏了,客户机断开并再次连接时,socketId会发生变化,并且io.to(socketId).emit('xxx');会失败。那么如何实现re-emit方法来处理重新连接呢?

我的问题与此相反,socket.io在x秒/第一次尝试获得响应失败后停止重新发出事件,从中我了解到socket.io客户端在重新连接时可以重新发出事件。但是服务器代码似乎缺乏这种支持。

---更新---

第三,当我得到redis pub事件而socketId值变得陈旧时,我的问题就会发生。实际上,socketid的值是最新的值,但是套接字可能无法发送消息。

io.on('connection', async function (socket) {
  socket.on('login', async function (user_id, fn) {
    ...
    await redis
      .multi()
      .hset('websocket:socket_user', socket.id, user_id)
      .hset(
        `websocket:${user_id}`,
        'socketid',
        socket.id
      )
      .exec()
    await sub.subscribe(user_id)
    ...
  }
                
  socket.on('disconnect', async function (reason) {     
    let user_id = await redis.hget('websocket:socket_user', socket.id)
    await redis.del(`websocket:${user_id}`)
    sub.unsubscribe(user_id)
    ...
  }
  
  //Here is what problem happens when socket is trying to reconnect 
  //while I got redis pub message

  sub.on('message', async function (channel, message) {
  let socketid = await redis.hget(`websocket:${channel}`, 'socketid')
  if (!socketid) {
    return
  }
  //so now I assume the socketid is valid, 
  //but it turns out clients still complain they didn't receive message
  io.to(socketid).emit('msg', message) //When it fails how do I re-emit?
})

共有1个答案

陈季
2023-03-14

通过覆盖默认方法生成套接字ID,可以为套接字客户端生成自定义socket.id。在这种情况下,socket.id将为您所知,并且可以在相同的id联机时重新发出。

//调用该函数时使用节点请求对象(http.IncomingMessage)作为第一个参数。根据socket.io文档

io.engine.generateId = (req) => {
  return "custom:id:" + user_unique_id; // custom id must be unique
}
 类似资料:
  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 我在服务器上有一个专用于套接字的Node/Express应用程序,在客户端上它是Angular 1.5。使用相同的架构(例如单独的套接字服务器)在http上本地运行代码,一切都运行得非常好。 当我在本地运行代码时,它创建了一个连接,并通过xhr进行了很少的轮询。在采用https的cloudflare上,它会进行大量轮询,不断重新连接,并且似乎不是所有消息都会到达web客户端 消息到达cloudfl

  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 我正在存放插座。每个用户使用redis登录时的id 当这个用户的任何帖子。_id被创建时,我试图使用上面存储的socket.id向那个特定用户的套接字发出一个事件 问题是我无法使用上述代码向该特定套接字发出。我正在使用套接字。io版本

  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出

  • 我有一个关于如何改进这个代码的问题。我是Socket.io的新手,我一直在YouTube上看一个关于私人信息的视频教程。我只是想知道有没有更好的方法来改进下面的代码行? 但似乎不起作用。