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

时间:2016-05-04 14:52:16

标签: node.js sockets express eventemitter mplayer

我使用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));

mplayer for nodejs

通过stackoverflow进一步调查时,它似乎与此问题类似: Local eventEmitter listening to global eventEmitter

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

This is a diagram of what I understand is happening. Any way to circumvent this ???

1 个答案:

答案 0 :(得分:0)

问题似乎是这段代码

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
    }

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