Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io客户端:是否使用一个处理程序响应所有事件?_Javascript_Events_Socket.io - Fatal编程技术网

Javascript Socket.io客户端:是否使用一个处理程序响应所有事件?

Javascript Socket.io客户端:是否使用一个处理程序响应所有事件?,javascript,events,socket.io,Javascript,Events,Socket.io,是否可以让socket.io客户端响应所有事件而不单独指定每个事件 例如,类似这样的东西(显然现在不起作用): 我希望在客户端socket.io代码接收到任何/所有事件时调用此回调函数 这可能吗?如何操作?看起来socket.io库将这些存储在字典中。因此,如果不修改源代码,这是不可能的 发件人: 给你 var socket = io.connect(); var globalEvent = "*"; socket.$emit = function (name) { if(!this.$

是否可以让socket.io客户端响应所有事件而不单独指定每个事件

例如,类似这样的东西(显然现在不起作用):

我希望在客户端socket.io代码接收到任何/所有事件时调用此回调函数


这可能吗?如何操作?

看起来socket.io库将这些存储在字典中。因此,如果不修改源代码,这是不可能的

发件人:

给你

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));
});
var socket=io.connect();
var globalEvent=“*”;
套接字。$emit=函数(名称){
如果(!this.$events)返回false;
对于(var i=0;i,当前(2013年4月)在('anything')
上提到了一个
套接字。似乎'anything'是自定义事件名称的占位符,而不是捕获任何事件的实际关键字


我刚刚开始使用web sockets和Node.JS,并且立即需要处理任何事件,以及发现发送了哪些事件。我不太相信socket.io中缺少此功能。

socket.io存储库问题页面上出现了问题。那里发布了各种解决方案(例如,用EventEmitter2覆盖EventEmitter)。lmjabreu几周前发布了另一个解决方案:一个名为npm的模块,它将通配符事件中的补丁修补到Socket.IO上(与当前的Socket.IO,~0.9.14一起使用)。

注意:这个答案仅对Socket.IO 0.x有效

您可以覆盖套接字。$emit

使用以下代码,您可以使用两个新函数:

  • 捕捉所有事件
  • 仅捕获旧方法未捕获的事件(它是默认侦听器)
我找到的所有方法(包括socket.io-wildcard和socketio-wildcard)对我都不起作用

在阅读socket.io代码后,我修补了以下代码:

var Emitter = require('events').EventEmitter;
var emit = Emitter.prototype.emit;
[...]
var onevent = socket.onevent;
socket.onevent = function (packet) {
    var args = ["*"].concat (packet.data || []);
    onevent.call (this, packet);    // original call
    emit.apply   (this, args);      // additional call to catch-all
};

这可能也是其他人的解决方案。但是,我不太明白为什么其他人似乎对现有的“解决方案”没有问题?有什么想法吗?可能是我的旧节点版本(0.10.31)由于您的问题在寻求解决方案时非常笼统,因此我将推荐这个问题,它不需要破解代码,只需要更改套接字的使用方式

我刚刚决定让我的客户端应用程序发送完全相同的事件,但使用不同的负载

socket.emit("ev", { "name" : "miscEvent1"} );
socket.emit("ev", { "name" : "miscEvent2"} );
在服务器上,类似于

socket.on("ev", function(eventPayload) {
   myGenericHandler(eventPayload.name);
});
我不知道总是使用同一事件是否会导致任何问题,可能是某种规模的碰撞,但这很好地满足了我的目的。

@Matthias Hopf-answer

更新了v1.3.5的答案。如果您想同时收听旧事件和
*
事件,则args存在错误

var Emitter = require('events').EventEmitter;
var emit = Emitter.prototype.emit;
// [...]
var onevent = socket.onevent;
socket.onevent = function (packet) {
    var args = packet.data || [];
    onevent.call (this, packet);    // original call
    emit.apply   (this, ["*"].concat(args));      // additional call to catch-all
};

更新的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的答案很接近,但没有一个对我有效,这是我调整后的版本


注意:这只捕获自定义事件,不捕获连接/断开连接等

最后,有一个名为的模块,允许在客户端和服务器端使用通配符

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

io.use(middleware);

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

io.listen(8000);

socket.io-client 1.7.3

截至2017年5月,无法使任何其他解决方案按我所希望的方式工作-制作了一个拦截器,仅将at 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)
  }
})
参考资料:


我使用的是Angular 6和npm软件包:ngx socket io

import { Socket } from "ngx-socket-io";

连接套接字后,我使用此代码,这是处理所有自定义事件

const onevent = this.socket.ioSocket.onevent;
this.socket.ioSocket.onevent = function (packet: any) {
  const args = packet.data || [];
  onevent.call(this, packet);    // original call
  packet.data = ["*"].concat(args);
  onevent.call(this, packet);      // additional call to catch-all
};
this.socket.on("*", (eventName: string, data: any) => {
  if (typeof data === 'object') {
    console.log(`socket.io event: [${eventName}] -> data: [${JSON.stringify(data)}]`);
  } else {
    console.log(`socket.io event: [${eventName}] -> data: [${data}]`);
  }
});

尽管这是一个老问题,但我也遇到了同样的问题,并使用
Node.js
中的本机套接字解决了这个问题,该套接字在每次出现数据时都会触发.on('data')事件。因此,到目前为止,我已经完成了以下工作:

const net = require('net')

const server = net.createServer((socket) => {
    // 'connection' listener.
    console.log('client connected')

    // The stuff I was looking for
    socket.on('data', (data) => {
        console.log(data.toString())
    })

    socket.on('end', () => {
        console.log('client disconnected')
    })
})

server.on('error', (err) => {
    throw err;
})

server.listen(8124, () => {
    console.log('server bound');
})
正如它在:


也发现了这一点:在2019年,我认为情况不再如此。Socket.IO.js build:0.9.10,development。这最终会出现在发行版中吗?但那只是服务器端…他的模块在客户端(浏览器)上不可用。在调用apply.setTimeout(function(){original$emit.apply(Socket,['*]].concat(args))之前,没有任何关于aync操作的建议);if(!original_$emit.apply(socket,参数)){original_$emit.apply(socket,['default'].concat(args));},2000);我正在使用Socket.IO 1.3.6,而且在
Socket
中似乎再也没有$emit方法了。检查@Flion answer for 1.x版本我打开了以下关于转发所有事件类型的问题,我还添加了我发现的解决方案:我可以确认它是有效的,正如您所观察到的,它是唯一有效的方法(从某种意义上说:对我来说也是有效的)。非常感谢!谢谢,这帮助我调试丢失的事件!不幸的是,无法使用“user.*”;。也许我可以实现它。您好,非常好,但如果您能提供一些输出示例,可能会有所帮助。^^我觉得我需要运行代码来理解您的答案:)
import { Socket } from "ngx-socket-io";
constructor(private socket: Socket) { }
const onevent = this.socket.ioSocket.onevent;
this.socket.ioSocket.onevent = function (packet: any) {
  const args = packet.data || [];
  onevent.call(this, packet);    // original call
  packet.data = ["*"].concat(args);
  onevent.call(this, packet);      // additional call to catch-all
};
this.socket.on("*", (eventName: string, data: any) => {
  if (typeof data === 'object') {
    console.log(`socket.io event: [${eventName}] -> data: [${JSON.stringify(data)}]`);
  } else {
    console.log(`socket.io event: [${eventName}] -> data: [${data}]`);
  }
});
const net = require('net')

const server = net.createServer((socket) => {
    // 'connection' listener.
    console.log('client connected')

    // The stuff I was looking for
    socket.on('data', (data) => {
        console.log(data.toString())
    })

    socket.on('end', () => {
        console.log('client disconnected')
    })
})

server.on('error', (err) => {
    throw err;
})

server.listen(8124, () => {
    console.log('server bound');
})
socket.onAny((event, ...args) => {
  console.log(`got ${event}`);
});