2017-10-28 12 views
0

Node.js 및 socket.io에 웹 응용 프로그램을 쓰고 있습니다. 사용자가 버튼을 클릭 한 다음 특정 동작 (이 경우 작은 음색 재생)을 수행 할 때 선택하는 몇 가지 버튼 리스너가 있습니다. 어떤 이유로 이러한 버튼은 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

이 모든 것이 데스크톱 브라우저에서 제대로 작동합니까? – wrangler

+0

@ 랭글러는 Chrome에서 완벽하게 작동합니다 (Ubuntu 데스크톱). Firefox (우분투 데스크톱) 및 Chrome 모바일에서 오디오 출력을 얻을 수 있지만 버튼을 누르면 수신 기능이 실행되지 않습니다. iOS의 Safari가 전혀 작동하지 않습니다. – javathunderman

+2

이벤트 리스너 내에서'console.log'를 시도해보십시오. 리스너가 호출되지 않았는지 확인하십시오. 그러면 문제가 발생할 수 있습니다. 그러면 html의 Dom 폴더에서 호출됩니다. 그러면 이벤트가 수신 된 후에 메시지가 방출되지 않습니다. – wrangler

답변

1

처음에는 socket.broadcast.emit()이 클라이언트 측 방법이 아닙니다. 이는 서버에서 사용할 수있는 것입니다. 클라이언트는 socket.emit()으로 서버에만 보냅니다.

클라이언트가 직접 다른 클라이언트에 메시지를 보내지 않습니다. socket.io가 작동하는 방식이 아닙니다. socket.io는 클라이언트에서 서버로의 연결입니다. 이 방법은 일부 플랫폼에서 작동하고 서버에 메시지를 보낼 수 있지만 문서화되어 있지 않으므로 어떤 클라이언트 플랫폼에서도 사용해서는 안됩니다.

문서화되지 않은 socket.broadcast.emit()을 사용하려고하면 iOS 구현이 아무 것도 수행하지 않거나 내부 오류가 발생했을 수 있습니다. 대신 socket.emit()을 사용해야합니다.

클라이언트에서 다른 클라이언트로 메시지를 릴레이하려면 해당 활동에 대해 서버에 보내는 고유 한 메시지를 작성한 다음 서버가 해당 메시지를 수신하면 서버가 다른 클라이언트로 브로드 캐스팅 할 수 있습니다.

+0

죄송합니다. 나는 당신의 경로를 가기로 결심했고 버튼들은 socket.emit()을 통해 서버를 호출하게했다. 감사. – javathunderman