2013-02-21 107 views
1

也許我沒有完全理解相關問題中的答案。我得到了長輪詢,反向AJAX的概念,但事情是這樣的:服務器到客戶端的更新沒有來自客戶端的持續/持久請求Websocket編程

我目前的設置是在我的本地單位,我是客戶端,我是服務器。我可以成功建立到我的服務器的連接,並且一旦建立連接,我就可以向客戶端發送一條消息,現在又出現了另一個場景,我只希望服務器在建立連接後不斷更新客戶端。爲了簡單起見,假設我希望我的客戶端更新服務器時間,因此每當時間發生變化時,服務器會將最新時間發送給客戶端(假設連接已建立)。

我正在使用node.js和socket.io。以下是我的代碼:

客戶:

<!DOCTYPE html> 
<meta charset="utf-8" /> 
<title>WebSocket Testing</title> 
<script src="/socket.io/socket.io.js"></script> 

<script language="javascript" type="text/javascript"> 
var socket = new io.connect("http://127.0.0.1:8080"); 
socket.on('connect', function(){ 

// socket.on('news', function (data) { 
// socket.emit('my other event', { my: 'data' }); 


     socket.on("test",function(data){ 
      alert(data); 
     }); 


    socket.onmessage = function (event) { 
     console.log(event.data); 
    } 

}); 
console.log(socket); 
</script> 
<h2>WebSocket Test</h2> 
<div id="output"></div> 
</html> 

SERVER:

var socketOptions = { 
      transportOptions: { 
        'xhr-polling': { 
          closeTimeout: 20000000, //20 mins 
          timeout: 20000000 //20 mins 
        } 
      } 
    }; 

var app = require('http').createServer(handler) 
    , url = require('url') 
    , io = require('socket.io').listen(app,socketOptions) 

    , fs = require('fs') 

app.listen(8080); 

function handler (req, res) { 
    var path = url.parse(req.url).pathname; 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
    console.log("ERROR: "+err) 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    // res.writeHead(200); 
    //res.writeHead(200, {'Content-Type': path == 'json.js' ? 'text/javascript' : 'text/html'}) 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    console.log("THIS IS IT"); 
    res.end(data); 
    }); 

} 

console.log(io); 

io.sockets.on('connection', function (socket) { 
// socket.send("testing lang kung nagsesend"); 
// console.log("connection"); 
// socket.emit('news', { hello: 'world' }); 
// socket.on('my other event', function (data) { 
// console.log(data); 
// }); 


    socket.emit("test","Test connection message established,send and received"); 
}); 

我該怎麼做我的服務器代碼?我可以注意到,幾乎所有的代碼示例都是使用php格式的。

回答

1

使用函數在回調函數中創建一個setInterval,在connection已被觸發後,您希望它在數秒內完成設置。你正在尋找這樣的事情:

io.sockets.on('connection', function (socket) { 
    setInterval(function(){ 
     // do a socket emit here to give data to client 
    },1000); 
} 
+0

它會設置每個連接從客戶端後間隔。應該是在app.listen之後(8080); ? – 2013-02-21 08:45:18

+0

是的,這也是可能的!但取決於你在找什麼。此外,如果您使用此方法,請務必在斷開連接事件後保持乾淨時刪除間隔。 – GiveMeAllYourCats 2013-02-21 08:49:11

+0

我認爲,如果是這種情況,但是不會對我的服務器造成負擔?如果場景是發生變化值的變化,我應該應用if..then語句的常規邏輯嗎?也許我的問題是socket io是否具有連續向服務器提供數據的功能? 「 – Charmie 2013-02-21 10:14:14

相關問題