【问题标题】:Socket.io emits message to all clients except the one that initially emitted the original messageSocket.io 向所有客户端发出消息,但最初发出原始消息的客户端除外
【发布时间】:2018-06-24 13:02:49
【问题描述】:

我有两个或多个客户端连接到 Socket.io 房间,客户端 #1 发出如下消息:

export function appendChild({ item }){
  socket.emit(APPEND_CHILD, { item })
  return {
    type: APPEND_CHILD,
  }
}

这成功发送消息到服务器,如下所示:

socket.on('APPEND_CHILD', async ({ item }) => {
  ...
  socket.in(socket.handshake.query.room).emit('APPEND_CHILD_AFTER_EFFECT', { payload: { log, parentLog }, socketId: socket.id })
})

请注意,为了触发这一点,我使用一种消息类型,并且为了 ping 所有客户端进行更新,我使用不同的消息,当发送时,所有客户端都应该接收到它们,并且它们都应该更新它们的状态。

客户端像这样监听传入的消息:

socket.on('APPEND_CHILD_AFTER_EFFECT', ({ payload, socketId }) => {
        console.log('test !')
        ...
      })

除活动(发送初始发射的那个)之外的所有客户端都收到消息。

为什么主客户端没有收到消息以及如何做到这一点?

【问题讨论】:

  • 对我来说似乎合乎逻辑的是,发送事件的客户端不需要通知......
  • @James 在大多数情况下确实如此,但在某些情况下您需要它,特别是如果您需要来自服务器的一些数据。具体就我而言,我需要客户端请求操作,然后服务器将使用客户端的输入并创建对象,然后将该对象发送给所有客户端,以便他们可以更新他们的 UI,包括发送者。 (这样我可以避免重复创建对象的逻辑)

标签: javascript node.js websocket socket.io


【解决方案1】:

来自 Discord 的 @guico33 注意到我在向所有客户端发射时使用了 socket 对象而不是 io

io.on('connect', socket => {
    socket.on('event', message => { 
        socket.in(room).emit(...) 
    })
})

应该是这样的:

  io.in(socket.handshake.query.room).emit(message, data)

而不是:

  socket.in(socket.handshake.query.room).emit(message, data)

我应该使用io.in(room).emit(...) 而不是socket.in(room).emit(...) 将响应发送给包括发射器在内的所有人。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 2019-08-04
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多