我使用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));
通过stackoverflow进一步调查时,它似乎与此问题类似: Local eventEmitter listening to global eventEmitter
但是注释中提供的解决方案对我来说没有意义,因为使用了addListener和removeListener?有人可以为我分解并解释我将如何实现那里提到的内容吗?
答案 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
}
让玩家进入连接块会导致每个客户端作为监听器绑定到播放器。在将所有玩家事件处理移至全局范围时,问题似乎已经消失。