2013-08-21 2 views
4

다음 코드 페이지가 있습니다.알 수없는 socket.io 이벤트를 처리하는 방법

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'이벤트 ...? ..

+0

wt u는 알 수없는 이벤트를 의미합니다. 서버 쪽에서 클라이언트에서 이벤트를 발생 시키면 socket.on ('urEventName', urFun)에 의해 해당 이벤트를 처리 할 수 ​​있습니다. – sachin

+2

해당 이벤트에 대해 등록 된 이벤트 핸들러가 없으면 서버에서 아무 것도 발생하지 않습니다. 요청 수신시 이벤트 이미 터 는이 이벤트에 등록 된 핸들러가 있는지 확인합니다. 아무 것도 발견되지 않으면 그냥 반환합니다. – Chandu

+0

'알려지지 않은'이벤트가 방대한 상승으로 연결되면 해당 소켓의 연결을 끊고 싶습니다. 대규모 요청 (빈 이벤트 포함)은 서버로드가 많습니다 ... 클라이언트의 악의적 인 공격을 두려워합니다. – waitfor

답변

2

이전 질문이지만 이전과 유사한 문제가 발생하여이를 수행 할 방법을 공유 할 것이라고 생각했습니다.

클라이언트 측

그래서 그 대신 방출하는 첫 번째 인수로 이벤트를 전달하는 클라이언트에 event이나 뭐 같은 일반적인 이벤트 이름을 사용합니다. 나는 그것이 짧았 기 때문에 나는 app의 이름을 사용하는 것을 끝내었다. 그런 다음 데이터 객체에서 호출 할 함수의 이름을 전달합니다. 대부분 단지 emit 내가있는 socket.io 클라이언트를 감싸 그래서 -ing 클라이언트 측에서 모든 것을 다시 쓰기

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

짜증, 내 클라이언트 물건이었다

그래서이 :

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

이된다 다른 객체는 이벤트 이름과 데이터 객체에서 변경 한 자체 emit 이벤트입니다.

서버 측

이제 서버 측에서 오직 하나의 사용자 정의 이벤트가 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을 모든 함수에 전달하는 것이 좋습니다.

-1

경우 클라이언트 측 또는 서버 측 Socket.io 해당 이벤트에 대해 등록 된 핸들러가 없으면 처리하지 못하므로 반환하고 아무 것도하지 않습니다.

클라이언트가 등록되지 않은 이벤트를 서버에 보내는 경우 수신 된 각 메시지에 대해 항상 클라이언트 쪽 또는 서버 쪽에서 message 이벤트를 사용할 수 있습니다.

socket.on('message',function(m){console.log(m);}); 
+1

답변의 첫 번째 부분은 맞지만 등록되지 않은 이벤트에 대한 후반부는 맞춤 이벤트를 발생시키기 때문에 작동하지 않습니다. v.9.13에서 테스트되었습니다. 아마도 v1에서도 마찬가지입니다. –

0

Gntem이 말한 것처럼 서버 측 Socket.io에 등록 된 이벤트 핸들러가없는 경우 이벤트가 반환되고 아무 것도 처리하지 않습니다.

다른 보호 기능 (예 : 등록되지 않은 이벤트로 누군가를 스팸 보내기를 기대하는 사람)을 찾고 있다면 이벤트 이름이 유효한지 확인하거나 다른 특성을 테스트하는 미들웨어를 사용해보십시오.이런 식으로 뭔가 :

이 작업을 수행 할 경우, 당신은 (심장 박동, 연결, 메시지, JSON, 등 등), 이름을 예약 한 수 패킷을 읽는 것을
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 
    }) 
}); 

참고.

여기 패킷에 대한 참조입니다 : 나는 실제로이를 사용하지 않는 http://gevent-socketio.readthedocs.io/en/latest/packet.html

주, 그래서 문제가 가지고 올 수 있습니다 무엇인지 전혀 모른다. 방금 이벤트 이름이 패킷의 일부에 있는지 확인했습니다. 이러한 패킷 내부에서 실제로 진행되는 작업과 관련하여 자세한 문서를 찾아야합니다 (또는 더 많은 테스트를 수행해야합니다).

관련 문제