未知socket.io事件时如何处理

wai*_*for 5 node.js socket.io

我有以下代码服务器端。

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function (socket) {
  socket.on('event', function(data){
     // process...
  });
});
Run Code Online (Sandbox Code Playgroud)

客户端(部分)

socket.emit('event', {type:'command', data:'data....'});
for (var i=0; i<=9999999; i++){
  socket.emit('unknownEvent', {'type':'attack', data:'a34tagfa3wtasfd'});
}
Run Code Online (Sandbox Code Playgroud)

现在,如何处理和防御 'unknownEvent' 事件...?...

aro*_*uby 3

较旧的问题,但遇到了类似的事情,所以我想我会分享一种方法来做到这一点。

客户端

因此,在客户端上,不要将事件作为要发出的第一个参数传递,而是使用通用事件名称,例如类似的event东西。我最终使用了应用程序的名称,因为它很短。然后在数据对象中,传入要调用的函数的名称。

所以这:

socket.emit('awesomeSocketEvent', {hello: 'world'});
Run Code Online (Sandbox Code Playgroud)

变成:

socket.emit('genericEvent', {event:'awesomeSocketEvent', hello:'world'});
Run Code Online (Sandbox Code Playgroud)

重写客户端上的所有内容都很糟糕,而且我的客户端内容大多只是emit-ing,所以我将 socket.io 客户端包装在另一个对象中,并使用它自己的发出事件来更改事件名称和数据对象。

服务器端

现在,在服务器端只会有一个名为 的自定义事件,genericEvent因此需要将自定义事件重组为对象的属性。一旦发生这种情况,只需检查该事件是否存在于对象中,如果存在则调用它,如果不存在则执行其他操作。

io.sockets.on('connection', function (socket) {

    var events = {
        awesomeSocketEvent: function(data){
            // do your socket stuff here
        }
    };

    socket.on('genericEvent', function(data){
        if(data.event in events){
            events[data.event](data);
        } else {
            // do your unknown event stuff here
        }
    });

});
Run Code Online (Sandbox Code Playgroud)

在编写该部分时查看代码后,我不确定在连接事件中声明事件对象的性能。最好events在连接事件之外声明,然后传递socket给所有函数。