5

我有以下代码服务器端。

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

io.sockets.on('connection', function (socket) {
  socket.on('event', function(data){
     // process...
  });
});

客户端(部分)

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

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

4

3 回答 3

3

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

客户端

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

所以这:

socket.emit('awesomeSocketEvent', {hello: 'world'});

变成:

socket.emit('genericEvent', {event:'awesomeSocketEvent', hello:'world'});

重写客户端上的所有内容都很糟糕,而且我的客户端内容大多只是 -emit所以我将 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
        }
    });

});

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

于 2015-01-23T07:30:03.943 回答
0

正如 Gntem 所说,如果服务器端 Socket.io 没有注册的事件处理程序,那么该事件只会返回并且不会处理它。

如果您正在寻找更多保护(例如,您希望有人向您发送未注册事件的垃圾邮件),您可以考虑使用中间件来检查事件名称是否有效(或测试其他质量)。像这样的东西:

const socketChecker = {
    someEvent:true,
}

io.on('connection', function(socket) {
    socket.use((packet, next) => {
        if(socketChecker[packet[0]] === true){
            next()
        } else {
            //Disconnect user here
        }
    });
    socket.on('someEvent',function(){
        //do work here
    })
});

请注意,如果您这样做,您正在读取可能具有保留名称的数据包(如 heartbeat、connect、message、json 等)。

这是数据包的参考:http: //gevent-socketio.readthedocs.io/en/latest/packet.html

请注意,我实际上并没有使用它,所以我不知道它可能会出现什么问题。我刚刚检查了事件名称在某些数据包中的位置。关于这些数据包内部实际发生的情况,应该找到进一步的文档(或应该进行更多测试)。

于 2018-02-07T04:36:23.420 回答
-1

如果客户端或服务器端Socket.io没有为该事件注册的处理程序,那么它将不会处理它,这意味着它将返回并做任何事情。

但是,如果客户端向服务器发送未注册的事件,您始终可以message在客户端或服务器端为收到的每条消息使用该事件。

socket.on('message',function(m){console.log(m);});
于 2013-08-21T08:30:07.160 回答