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

これはすべてデスクトップブラウザで動作しますか? – wrangler

+0

@wranglerそれは完全にクロム(Ubuntuデスクトップ)で動作します。私はFirefox(Ubuntuデスクトップ)とChromeモバイルでオーディオ出力を得ることができますが、ボタンを押すとリスナー機能が起動されません。 iOSのSafariはまったく動作しません。 – javathunderman

+2

イベントリスナー内で 'console.log'を試してみましょう。リスナーが呼び出されていない場合、呼び出されていない場合、問題が発生する可能性があります。 – wrangler

答えて

1

まず、socket.broadcast.emit()はクライアント側の方法ではありません。それはサーバー上で利用できるものです。クライアントはsocket.emit()でサーバーにのみ送信します。

クライアントは直接他のクライアントにメッセージを送信しません。これはsocket.ioの動作方法ではありません。 socket.ioはクライアントからサーバーへの接続です。メソッドは一部のプラットフォームで動作し、サーバーにメッセージを送信することがありますが、これは文書化されておらず、どのクライアントプラットフォームでも使用しないでください。

文書化されていないsocket.broadcast.emit()を使用しようとすると、おそらくiOSの実装で何も起こらないか、何らかの内部エラーが発生する可能性があります。代わりにsocket.emit()を使用する必要があります。

クライアントから他のクライアントにメッセージをリレーする場合は、そのアクティビティのサーバーに送信する独自​​のメッセージを作成し、サーバーがそのメッセージを受信すると、サーバーは他のクライアントにブロードキャストできます。

+0

申し訳ありませんが、誤ってクリックします。私はあなたのルートに行くことにしました、そして、私はボタンをsocket.emit()経由でサーバーに呼び出しさせました。ありがとう。 – javathunderman

関連する問題