Слушатели кнопки Socket.io не работают на мобильном телефоне
Я пишу веб-приложение в Node.js и socket.io. У меня есть пара слушателей кнопок, которые получают сигнал, когда пользователь нажимает кнопку, а затем выполняет определенное действие (в данном случае, проигрывая небольшой сигнал). По какой-то причине эти кнопки отлично работают в Chrome/Chromium, но не работают в Firefox или в мобильных браузерах (я тестировал их с Safari на iOS и Chrome на Android).
Вот мой код:
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(). Спасибо за вашу помощь!
1 ответ
Для начинающих, socket.broadcast.emit()
не является методом на стороне клиента. Это то, что доступно на сервере. Клиент отправляет ТОЛЬКО на сервер с socket.emit()
,
Клиент не отправляет сообщения напрямую другим клиентам - это не то, как работает socket.io. socket.io - это соединение вашего клиента с вашим сервером. Хотя метод может работать на некоторых платформах и отправлять сообщение на ваш сервер, он не задокументирован и не должен использоваться на любой клиентской платформе.
Возможно, реализация iOS ничего не делает или имеет какую-то внутреннюю ошибку при попытке использовать недокументированное socket.broadcast.emit()
, Вы должны использовать socket.emit()
вместо.
Если вы хотите передать сообщения другим клиентам от клиента, вы создаете свое собственное сообщение, которое вы отправляете на сервер для этого действия, а затем, когда сервер получает это сообщение, сервер может затем транслировать другим клиентам.