2011-10-02 80 views
2

我正在嘗試node.js和socket.io。我不想使用刪除ping功能,我必須從我的服務器獲取更新。下面是我在做什麼的示例代碼:Socket.io不發送消息到所有連接的套接字

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); 
}); 
+0

在你的客戶端代碼中,是否有'error'和'change'的處理程序?您可以在此處添加代碼,以幫助確定問題。 – Fosco

+0

@Fosco我更新並添加了客戶端代碼。它在循環處於服務器的套接字配置時用於工作。當我將它改爲只有一個循環並將消息發送給每個停止工作的消息時。 –

回答

1

幾天前有一個非常類似的問題,看起來像socket.io在API中有一些變化。我從來沒有與symfony合作過,希望問題是一樣的。

我已經socket.io的工作演示發送和接收的消息 - 上載到https://github.com/parj/node-websocket-demo作爲參考

本質兩個變化

  1. 在服務器側 - 改變socket.onsocket.sockets.on

    var socket = io.listen(server); 
    socket.sockets.on('connection', function(client) 
    
  2. 在客戶端 - URL和端口不是必需的,因爲它是自動檢測的。

    var socket = io.connect(); 
    

這已經使用快遞2.5.2和Socket.io測試0.8.7

我已經混合了與我的服務器代碼,你就可以嘗試這種在服務器上,我的client javascriptclient 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(); 

}); 
+0

幾個小時後,我把頭靠在牆上,讓我從樹林裏走出來。 Socket.IO文檔是垃圾。 Upvote,謝謝! – Thomas

相關問題