繁体   English   中英

从一个套接字发出两个事件

[英]emit two events from one socket

我正试图从一个插座中听两个不同的事件; 两者在一起都不起作用,只有第一个被发射才能听。

//server
​
_this.nsp.volatile.emit('event1', foo);
_this.nsp.volatile.emit('event2', bar);
​

//client
​
socket.on('event1', function(data){
    //THIS ONE WORK
    console.log("event1");
});
socket.on('event2', function(data){
    //THIS ONE NOT
    console.log("event2");
});

在此示例中, event1将起作用,但event2不起作用。

如果我发出第一个event2event2将工作,但不是event1

知道如何让它工作吗?

TL; DR:如果要确保发送消息,请不要使用volatile

使用volatile意味着允许删除消息。 换句话说:你不能依靠他们被传递,或者以任何特定的顺序。

我用类似的代码运行了一个快速测试:

io.on('connection', (socket) => {
  socket.volatile.emit('event1', '1');
  socket.volatile.emit('event2', '2');
});

这两条消息都没有传递(无论如何,在我的设置中)。 据我所知,调试输出的原因是服务器和客户端仍在协商发送消息时要使用的传输。 因为它们是易失性的,所以一旦协商完成,服务器就不会将它们排队以将它们发送出去。

在等待一段时间后发出消息时会发生类似情况:

io.on('connection', (socket) => {
  setTimeout(() => {
    socket.volatile.emit('event1', '1');
    socket.volatile.emit('event2', '2');
  }, 2000);
});

这里收到第一条消息但第二条消息没有收到(这似乎与你的情况相似)。 调试日志显示如下:

  socket.io:client writing packet {"type":2,"data":["event1","1"],"nsp":"/"} +1s
  socket.io-parser encoding packet {"type":2,"data":["event1","1"],"nsp":"/"} +0ms
  socket.io-parser encoded {"type":2,"data":["event1","1"],"nsp":"/"} as 2["event1","1"] +1ms
  engine:socket sending packet "message" (2["event1","1"]) +0ms
  engine:socket flushing buffer to transport +0ms
  engine:ws writing "42["event1","1"]" +0ms
  socket.io:client writing packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms
  socket.io-parser encoding packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms
  socket.io-parser encoded {"type":2,"data":["event2","2"],"nsp":"/"} as 2["event2","2"] +0ms

由此,我必须得出结论,第二条消息编码的,但没有传递给engine.io部分,它处理实际的通信。 不过,它并没有说明原因。 也许这是因为第一个事件仍然被发送出去,但这只是我的猜想。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM