Javascript Socket.io向所有客户端发送消息,但最初发送原始消息的客户端除外
我有两个或多个客户端连接到Socket.io文件室,客户端#1发出如下消息:Javascript Socket.io向所有客户端发送消息,但最初发送原始消息的客户端除外,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我有两个或多个客户端连接到Socket.io文件室,客户端#1发出如下消息: export function appendChild({ item }){ socket.emit(APPEND_CHILD, { item }) return { type: APPEND_CHILD, } } 此消息已成功发送到服务器,如下所示: socket.on('APPEND_CHILD', async ({ item }) => { ... socket.in(sock
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 !')
...
})
除活动客户端(发送初始发射的客户端)外的所有客户端都收到了消息。
为什么主客户端没有收到消息,以及如何做到这一点?正如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)
我不应该使用
socket.in(room).emit(…)
,而应该使用io.in(room).emit(…)
将响应发送给包括发射器在内的所有人。在我看来,发送事件的客户端不需要通知似乎是合乎逻辑的…@James在大多数情况下都是这样,但在某些情况下,您需要它,特别是当您需要从服务器获取一些数据时。具体地说,在我的例子中,我需要客户机请求操作,然后服务器将使用客户机的输入并创建对象,然后将该对象发送给所有客户机,以便他们可以更新其UI,包括发送方。(这样我就避免了在创建对象时重复逻辑)