2017-10-28 42 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