繁体   English   中英

expressjs,socket.io和EventEmitter侦听器之间的交互

[英]Interaction between expressjs, socket.io and EventEmitter listeners

我有一个使用expressjs的服务器设置,它使用socket.io与前端客户端通信。 服务器在raspberry pi上运行,并使用mplayer nodejs模块为我的音乐库提供后端来控制mplayer播放器。

更新前端客户端的大多数操作都是基于mplayer EventEmitter模块发出的事件。 例如 :

当停止播放器的命令作为player.stop()发出时,播放器的EventEmitter实例会发出'stop'事件。

然后服务器按如下方式监听此事件: player.on('stop', socket.emit('stop'));

我注意到的问题是随着越来越多的客户端通过套接字连接到服务器,每个客户端都会为mplayer EventEmitter 'stop'事件创建一个监听器! 因此,例如,如果有3个客户端,我倾向于从播放器EventEmitter接收3个'stop'事件,并因此向我的前端客户端发送3个'stop'事件。

我的问题是如何确保只为玩家事件创建一个监听器? 为什么每个客户端都将自己绑定为EventEmitter事件的监听器?

我的服务器端socketio设置如下:

io.on('connection', function(socket) {
    console.log('a user connected @ ' + socket.id);

    ///// Listen for player to successfully stop playing or when EOF is reached
    player.on('stop', function() {
        console.log("Received Stop Event From Player");
        socket.emit('song:next'); //Play next song
    }

收到3个客户端时,收到'stop'事件时的控制台输出:

Received Stop Event From Player
Received Stop Event From Player
Received Stop Event From Player

这导致我发送3个'next'事件发送给我的所有客户。

MPlayer nodejs看起来像这样:

this.player.on('playstop', function() {
    if(options.verbose) {
        console.log('player.stop');
    }
    this.emit('stop')
}.bind(this));

nodejs的mplayer

通过stackoverflow进一步研究它似乎与这个问题类似: 本地eventEmitter监听全局eventEmitter

但是由于使用addListener和removeListener,注释中提供的解决方案对我来说没有意义。 有人可以为我分解并解释我将如何实现那里提到的内容吗?

这是我理解正在发生的事情的图表。有什么方法可以绕过这个???

问题似乎是这段代码

io.on('connection', function(socket) {
    console.log('a user connected @ ' + socket.id);

    ///// Listen for player to successfully stop playing or when EOF is reached
    player.on('stop', function() {
        console.log("Received Stop Event From Player");
        socket.emit('song:next'); //Play next song
    }

将播放器置于连接块内会导致每个客户端作为侦听器绑定到播放器。 在将所有玩家事件处理移动到全局范围时,问题似乎已经消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM