#node.js #socket.io
#node.js #socket.io
Вопрос:
Я пытаюсь node.js и socket.io . Я не хочу использовать для удаления функции ping, которую я должен получать обновления со своего сервера. Вот пример кода того, что я делаю:
var app = require('http').createServer(),
io = require('socket.io').listen(app),
cp = require('child_process');
app.listen(8080);
//I check a global value for all the connected users from the php command line
var t = setInterval(function(){
cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages',
function(err, stdout){
if (err) {
io.sockets.emit('error', 'An error ocurred while running child process.');
} else {
io.sockets.emit('change', stdout);
}
console.log('Remaining messages: ' stdout);
});
}, 3000);
var remaining = io.of('/getRemainingMessages')
.on('connection', function(socket){
socket.on('disconnect', function(){});
});
Проблема здесь в том, что когда я вызываю io.sockets.emit(), консоль отладки сообщает мне, что она что-то делает, но, похоже, это не доходит до клиентов. Потому что они ничего не делают.
Я использую один интервал для каждого подключенного клиента, и когда я использовал socket.emit(), это сработало. Но это не оптимальное решение.
ОБНОВЛЕНИЕ: вот мой код на стороне клиента.
var remaining = io.connect('http://127.0.0.1:8080/getRemainingMessages');
remaining.on('change', function(data){
console.log('Remaining messages: ' data );
$('#count').html(data);
});
remaining.on('error', function(error){
console.log(error);
});
Комментарии:
1. В вашем клиентском коде есть обработчики для обоих
error
иchange
? Вы можете включить этот код здесь, который может помочь определить проблему.2. @Fosco Я обновил и добавил код на стороне клиента. Раньше это работало, когда цикл зависел от конфигурации сокета на сервере. Когда я изменил его только на один цикл и отправил сообщение каждому, он перестал работать.
Ответ №1:
Пару дней назад возникла очень похожая проблема, и она выглядит как сокет.у io были некоторые изменения в API. Я никогда не работал с symfony и надеюсь, что проблемы те же.
У меня есть рабочая демонстрация сокета.io отправка и получение сообщения — загружено в https://github.com/parj/node-websocket-demo в качестве эталона
По сути, два изменения
-
На стороне сервера — изменено
socket.on
наsocket.sockets.on
var socket = io.listen(server); socket.sockets.on('connection', function(client)
-
На стороне клиента — URL и порт не требуются, поскольку они автоматически определяются.
var socket = io.connect();
Это было протестировано с использованием Express 2.5.2 и Socket.io 0.8.7
Я объединил ваш серверный код с моим, не могли бы вы попробовать это на сервере и моем клиентском javascript и клиентском html, просто чтобы посмотреть, работает ли это?
var socket = io.listen(server);
socket.sockets.on('connection', function(client){
var connected = true;
client.on('message', function(m){
sys.log('Message received: ' m);
});
client.on('disconnect', function(){
connected = false;
});
var t = setInterval(function(){
if (!connected) {
return;
}
cp.exec('/usr/bin/php /Users/crear/Projects/MandaFree/symfony api:getRemainingMessages',
function(err, stdout){
if (err) {
client.send('error : An error ocurred while running child process.');
} else {
client.send('change : ' stdout);
}
console.log('Remaining messages: ' stdout);
});
}, 3000);
t();
});