Socket.io 按钮侦听器无法在移动设备上运行
Socket.io button listeners not working on mobile
我正在 Node.js 和 socket.io 中编写网络应用程序。我有几个按钮侦听器,当用户单击一个按钮然后执行特定操作(在本例中,播放一个小音调)时,它们会拾取。出于某种原因,这些按钮在 Chrome/Chromium 中完美运行,但在 Firefox 或移动浏览器中不起作用(我已经在 iOS 上使用 Safari 和 [=28] 上的 Chrome 进行了测试=]).
这是我的代码:
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() 调用服务器。感谢您的帮助!
对于初学者来说,socket.broadcast.emit()
不是客户端方法。那是服务器上可用的东西。客户端仅向服务器发送 socket.emit()
。
客户端不会直接向其他客户端发送消息 - 这不是 socket.io 的工作方式。 socket.io 是从您的客户端到您的服务器的连接。虽然该方法可能适用于某些平台并向您的服务器发送消息,但它没有记录并且不应在任何客户端平台上使用。
也许 iOS 实现在您尝试使用未记录的 socket.broadcast.emit()
时什么都不做或出现某种内部错误。您应该改用 socket.emit()
。
如果你想从一个客户端向其他客户端中继消息,你可以创建你自己的消息,然后发送到服务器 activity 然后当服务器收到该消息时,服务器可以广播给其他客户。
我正在 Node.js 和 socket.io 中编写网络应用程序。我有几个按钮侦听器,当用户单击一个按钮然后执行特定操作(在本例中,播放一个小音调)时,它们会拾取。出于某种原因,这些按钮在 Chrome/Chromium 中完美运行,但在 Firefox 或移动浏览器中不起作用(我已经在 iOS 上使用 Safari 和 [=28] 上的 Chrome 进行了测试=]).
这是我的代码:
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() 调用服务器。感谢您的帮助!
对于初学者来说,socket.broadcast.emit()
不是客户端方法。那是服务器上可用的东西。客户端仅向服务器发送 socket.emit()
。
客户端不会直接向其他客户端发送消息 - 这不是 socket.io 的工作方式。 socket.io 是从您的客户端到您的服务器的连接。虽然该方法可能适用于某些平台并向您的服务器发送消息,但它没有记录并且不应在任何客户端平台上使用。
也许 iOS 实现在您尝试使用未记录的 socket.broadcast.emit()
时什么都不做或出现某种内部错误。您应该改用 socket.emit()
。
如果你想从一个客户端向其他客户端中继消息,你可以创建你自己的消息,然后发送到服务器 activity 然后当服务器收到该消息时,服务器可以广播给其他客户。