我有以下代码服务器端。
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' 事件...?...
较旧的问题,但遇到了类似的事情,所以我想我会分享一种方法来做到这一点。
因此,在客户端上,不要将事件作为要发出的第一个参数传递,而是使用通用事件名称,例如类似的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给所有函数。
| 归档时间: |
|
| 查看次数: |
2487 次 |
| 最近记录: |