2017-10-28 96 views
0

我写在Node.js和受socket.io一个Web应用程序。我有几个按钮监听器,当用户点击一个按钮然后执行一个特定的操作(在这种情况下,播放一个小音)时就会启动。出于某种原因,这些按钮在Chrome/Chromium中完美工作,但不适用于Firefox或移动浏览器(我已通过iOS上的Safari和Android上的Chrome对其进行了测试)。Socket.io按钮监听器不工作的移动

这里是我的代码:

var socket = io.connect('http://localhost:5000'); 

var long = document.getElementById('long'); 
short = document.getElementById('short'); 

long.addEventListener('click', function() { 
socket.emit('long', socket.id); 
socket.broadcast.emit('audio file', { 
    audio: true, 
    audioBuffer: buf 
}); 
}); 

short.addEventListener('click', function() { 
socket.emit('short', socket.id); 
socket.broadcast.emit('audio file', { 
    audio: true, 
    audioBuffer: buf2 
}); 
}); 

socket.on('long', function(data) { 
socket.broadcast.emit('audio file', { 
    audio: true, 
    audioBuffer: longbuf 
}); 
console.log("Transmitting", socket.id); 
}); 
socket.on('short', function(data) { 
socket.broadcast.emit('audio file', { 
    audio: true, 
    audioBuffer: shortbuf 
}); 
console.log("Transmitting", socket.id); 
}); 

server.js

var express = require('express'); 
var socket = require('socket.io'); 
var fs = require('fs'); 
var app = express(); 
var server = app.listen(5000, function() { 
console.log("Listening to requests on port 5000") 
}); 

app.use(express.static('public')); 

var io = socket(server); 

io.on('connection', function(socket) { 
console.log('New transmitter', socket.id); 
fs.readFile(__dirname + '/public/sounds/trollism.wav', function(err, 
longbuf) { 

    socket.on('long', function(data) { 
     socket.broadcast.emit('long', data); 
     console.log("Long press from " + socket.id); 
     socket.broadcast.emit('audio file', { 
      audio: true, 
      audioBuffer: longbuf 
     }); 

    }); 
}); 
    fs.readFile(__dirname + '/public/sounds/trollism2.wav', 
function(err, shortbuf) { 

    socket.on('short', function(data) { 
     socket.broadcast.emit('long', data); 
     console.log("Short press from " + socket.id); 
     socket.broadcast.emit('audio file', { 
      audio: true, 
      audioBuffer: shortbuf 
     }); 

    }); 
}); 
}); 

感谢您的帮助。

编辑:决定去jfriend00的路线,使客户通过socket.emit调用服务器()。谢谢你的帮助!

+0

你确定这一切都适用于dektop浏览器? – wrangler

+0

@ wrangler它完全适用于Chrome(Ubuntu桌面)。我能够在Firefox(也是Ubuntu桌面)和Chrome移动设备上获得音频输出,但按下按钮不会触发监听器功能。 iOS上的Safari并不起作用。 – javathunderman

+2

尝试'console.log'事件侦听器里面,看看是否监听器被调用时,如果不叫则可能是问题源于按钮大教堂在HTML好象叫的话,我想事件听了后没有发出消息。 – wrangler

回答

1

对于初学者来说,socket.broadcast.emit()不是客户端的方法。这是服务器上可用的东西。客户端仅向socket.emit()发送到服务器。

客户机并不直接发送消息给其他客户端 - 这不是如何socket.io作品。 socket.io是从客户端到服务器的连接。虽然该方法可能在某些平台上运行,并向服务器发送消息,但该方法没有记录,因此不应在任何客户端平台上使用。

也许iOS的实施要么什么都不做或有某种内部错误,当您尝试使用无证socket.broadcast.emit()。您应该使用socket.emit()来代替。

如果要从客户端向其他客户端中继消息,则需要创建自己的消息,并将该消息发送给服务器以进行该活动,然后当服务器接收到该消息时,服务器可以向其他客户端进行广播。

+0

对不起,错误。我决定走你的路线,并让我的按钮通过socket.emit()调用服务器。谢谢。 – javathunderman