javascript-即使不监视发出的事件,它们也会造成很大的负担吗?
作者:互联网
我花了几个小时研究这个问题,但找不到确切的答案,因此我提出了一个问题.我对Websocket很陌生,所以如果在某个地方可以轻松找到答案,请先深表歉意.
我目前有一个node.js服务器,它通过socket.io发出几个不同的websocket事件.因此,在服务器代码的不同部分中,我有如下几行:
io.sockets.emit('eventOne', data);
假设代码的其他部分还包含以下行:
io.sockets.emit('eventTwo', data);
我有两种不同类型的客户端连接到服务器.一种类型的客户端仅侦听第一个事件,因此具有以下内容:
socket.on('eventOne', function(data) {//blah blah}):
另一类客户端侦听另一事件,因此具有如下运行行:
socket.on('eventTwo', function(data) {//blah blah});
两个客户端都在没有空间的根级别上连接.例如,如果我们看第一组客户端,它只是在监视“ eventOne”事件,所以让我想知道这组客户端是否接收到“ eventTwo”事件的所有数据,或者是否没有,因为它们不要听他们的.
这是我的最终问题:客户端是否经历A:所有事件的全部网络负载,或B:仅针对他们正在监视的事件? (或C:他们正在监视的事件的全负载,而他们不监视的事件的部分负载)
我的猜测是,即使客户端代码没有监视所有事件,从服务器发出的所有事件都将通过websocket发出,并且两种类型的客户端都将承受两种事件的网络负载.但是,我的一部分认为,socket.io代码可能会通过拒绝接收客户端在确定事件是什么之后没有观看的事件的整个负载来减轻客户端的网络负载.
是的,在此示例中,两种类型的客户端应加入不同的房间,但我只是想更好地了解监视事件如何影响网络负载
预先感谢您的见解!
解决方法:
Do the clients experience A: the full network load for all events, or
B: only for events that they are watching for?
服务器不知道客户端是否正在侦听特定事件.因此,如果服务器代码要求将事件发送给所有客户端,则无论客户端是否正在监听该事件,它都会将事件发送给所有客户端.因此,上述问题的答案是A-发送给它的所有事件的全部网络负载.
However, a part of me thinks that socket.io code might reduce the
network load for clients by refusing to receive the entire payload for
events that they are not watching after it determines what the event
is.
不,TCP和socket.io不能那样工作.整个消息作为一个单元发送.无法取消部分消息.有效负载必须被分解为多个消息,并且客户端必须具有一定的发送能力,并告诉服务器它希望或不希望更多的消息.可以设计,但默认情况下不是这样.
如果您有两个类别的客户,每个类别的客户都对不同类别的消息感兴趣,那么您可能应该将给定的客户放在与其希望接收的内容相匹配的特定“房间”中.如果服务器知道哪个客户端是哪个客户端,则只要知道就可以将客户端放在正确的房间中.如果只有客户端知道,则客户端可以向服务器发送消息以请求放置在特定的“房间”中.您组成要在服务器上使用的“房间”名称-它们只是客户端的集合,实际名称并不重要.
然后,服务器可以将消息广播到适当的房间,只有要求进入该房间的客户端才能收到这些消息.这样,您就不会将消息发送给对它们不感兴趣的客户端.
从逻辑上讲,它就像一个聊天室.每个客户都进入包含其所需通知/消息类型的聊天室.如果需要,可以将其放入一个以上的房间.这是socket.io中内置的非常有用的功能.它可能最初是出于聊天目的而编写的,但对于通知类也很好用.
标签:node-js,websocket,socket-io,javascript 来源: https://codeday.me/bug/20191118/2031645.html