Слушатели кнопки 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() вместо.

Если вы хотите передать сообщения другим клиентам от клиента, вы создаете свое собственное сообщение, которое вы отправляете на сервер для этого действия, а затем, когда сервер получает это сообщение, сервер может затем транслировать другим клиентам.

Другие вопросы по тегам