[javascript] Socket.io 클라이언트 : 하나의 핸들러로 모든 이벤트에 응답합니까?

socket.io 클라이언트가 각 이벤트를 개별적으로 지정하지 않고도 모든 이벤트에 응답하도록 할 수 있습니까?

예를 들어, 다음과 같은 것 (지금 당장은 분명히 작동하지 않음) :

var socket = io.connect("http://myserver");

socket.on("*", function(){
  // listen to any and all events that are emitted from the
  // socket.io back-end server, and handle them here.

  // is this possible? how can i do this?
});

클라이언트 측 socket.io 코드에서 모든 이벤트를 수신 할 때이 콜백 함수가 호출되기를 원합니다.

이것이 가능한가? 어떻게?



답변

socket.io 라이브러리가 사전에 저장하는 것처럼 보입니다. 따라서 소스를 수정하지 않고는 이것이 가능할 것이라고 생각하지 마십시오.

에서 소스 :

EventEmitter.prototype.on = function (name, fn) {
    if (!this.$events) {
      this.$events = {};
    }

    if (!this.$events[name]) {
      this.$events[name] = fn;
    } else if (io.util.isArray(this.$events[name])) {
      this.$events[name].push(fn);
    } else {
      this.$events[name] = [this.$events[name], fn];
    }

    return this;
  };


답변

socket.io-client 1.3.7에 대한 업데이트 된 솔루션

var onevent = socket.onevent;
socket.onevent = function (packet) {
    var args = packet.data || [];
    onevent.call (this, packet);    // original call
    packet.data = ["*"].concat(args);
    onevent.call(this, packet);      // additional call to catch-all
};

다음과 같이 사용하십시오.

socket.on("*",function(event,data) {
    console.log(event);
    console.log(data);
});

Mathias Hopf와 Maros Pixel 중 하나가 가까워졌지만 이것은 내가 조정 한 버전입니다.

참고 : 이것은 연결 / 연결 해제 등이 아닌 사용자 지정 이벤트 만 포착합니다.


답변

마지막으로 클라이언트와 서버 측에서 와일드 카드 를 사용할 수있는 socket.io-wildcard 라는 모듈 이 있습니다.

var io         = require('socket.io')();
var middleware = require('socketio-wildcard')();

io.use(middleware);

io.on('connection', function(socket) {
  socket.on('*', function(){ /* … */ });
});

io.listen(8000);


답변

여기 있습니다 …

var socket = io.connect();
var globalEvent = "*";
socket.$emit = function (name) {
    if(!this.$events) return false;
    for(var i=0;i<2;++i){
        if(i==0 && name==globalEvent) continue;
        var args = Array.prototype.slice.call(arguments, 1-i);
        var handler = this.$events[i==0?name:globalEvent];
        if(!handler) handler = [];
        if ('function' == typeof handler) handler.apply(this, args);
        else if (io.util.isArray(handler)) {
            var listeners = handler.slice();
            for (var i=0, l=listeners.length; i<l; i++)
                listeners[i].apply(this, args);
        } else return false;
    }
    return true;
};
socket.on(globalEvent,function(event){
    var args = Array.prototype.slice.call(arguments, 1);
    console.log("Global Event = "+event+"; Arguments = "+JSON.stringify(args));
});

이 같은 행사 잡을 것 connecting, connect, disconnect, reconnecting너무, 너무 돌봐를 수행하십시오.


답변

참고 :이 답변은 socket.io 0.x에만 유효합니다.

socket. $ emit을 재정의 할 수 있습니다 .

다음 코드를 사용하면 두 가지 새로운 기능이 있습니다.

  • 모든 이벤트 트랩
  • 이전 메서드에 의해 트랩되지 않은 이벤트 만 트랩 (기본 리스너)
var original_$emit = socket.$emit;
socket.$emit = function() {
    var args = Array.prototype.slice.call(arguments);
    original_$emit.apply(socket, ['*'].concat(args));
    if(!original_$emit.apply(socket, arguments)) {
        original_$emit.apply(socket, ['default'].concat(args));
    }
}

socket.on('default',function(event, data) {
    console.log('Event not trapped: ' + event + ' - data:' + JSON.stringify(data));
});

socket.on('*',function(event, data) {
    console.log('Event received: ' + event + ' - data:' + JSON.stringify(data));
});


답변

노출 된 이벤트에 대한 현재 (2013 년 4 월) GitHub 문서 에는 socket.on('anything'). ‘anything’은 이벤트를 포착하는 실제 키워드가 아니라 사용자 지정 이벤트 이름에 대한 자리 표시자인 것으로 보입니다.

방금 웹 소켓과 Node.JS로 작업을 시작했고 즉시 이벤트를 처리하고 어떤 이벤트가 전송되었는지 알아 내야했습니다. 이 기능이 socket.io에 없다는 것을 믿을 수 없습니다.


답변

socket.io-client 1.7.3

2017 년 5 월 현재 다른 솔루션이 내가 원하는대로 작동하도록 만들 수 없었습니다. 테스트 목적으로 만 Node.js를 사용하여 인터셉터를 만들었습니다.

var socket1 = require('socket.io-client')(socketUrl)
socket1.on('connect', function () {
  console.log('socket1 did connect!')
  var oldOnevent = socket1.onevent
  socket1.onevent = function (packet) {
    if (packet.data) {
      console.log('>>>', {name: packet.data[0], payload: packet.data[1]})
    }
    oldOnevent.apply(socket1, arguments)
  }
})

참조 :