2015-04-20 113 views
0

我想使用NodeJS實現服務器端推送功能。 現在,我要的是一個監聽請求到特定的URL(例如http://localhost:8000/inputData?data=hello使用NodeJS服務器端推送

一旦這個請求,我想觀看client.html所有客戶端運行alert(hello);服務器。我所做的是下面的,在服務器端:

var app = require('http').createServer(handler), 
    io = require('socket.io').listen(app), 
    parser = new require('xml2json'), 
    fs = require('fs'), 
    url = require('url'); 



var qs = require('querystring'); 

app.listen(8000); 
console.log('server listening on localhost:8000'); 

function handler(req, res) { 
    var url_parts = url.parse(req.url, true); 
    var pathname = url_parts.pathname; 
    switch(pathname){ 
     case '/inputData': 
     var data = url_parts.query.data; 
     socket.emit('notifyData', data); //socket is undefined 
     break; 
     default: 
     fs.readFile(__dirname + '/client.html', function(err, data) { 
      if (err) { 
      console.log(err); 
      res.writeHead(500); 
      return res.end('Error loading client.html'); 
      } 
      res.writeHead(200); 
      res.end(data); 
     }); 
    } 

    ; 
} 

在客戶端,在client.html

<script> 
    var socket = io.connect('http://localhost:8000'); 

    socket.on('notifyData', function (data) { 
     alert(data); 
    }); 
</script> 

我得到一個錯誤,說socket沒有定義。我知道我應該早些定義它,但我不知道該怎麼做。

這是否正確地解決此類問題?或者emit應該位於不同的文件中,例如inputData.html?我寧願補充我已有的代碼,因爲我可能需要在var data= url_parts.query.data

+1

您是否在客戶端包含了一個[reference](http://socket.io/download/)到socket.io? '' –

+0

是的我做過了' –

回答

1

你有一個設計問題,在您的服務器作爲socket變量沒有定義的。如果你正在嘗試做的是廣播到所有客戶端,當任何一個點擊特定的URL,那麼你就可以做到這一點:

io.sockets.emit('notifyData', data); 

如果你想發出一個客戶端插座,然後你將不得不找到一種方法來找出你試圖發送到的io.sockets命名空間中的哪個套接字。

+0

準確地說,我想廣播給所有客戶端,當他們中的任何一個擊中該URL。我用'io.sockets.emit('notifyData',data)'替換了'socket.emit('notifyData',data);'並且它工作正常。謝謝! –

0

之前進行一組操作。從docs看來,您似乎沒有正確初始化服務器。

var app = require('http').createServer(handler) 
var io = require('socket.io')(app); 
var fs = require('fs'); 

app.listen(8000); 

/*...*/ 

io.on('connection', function (socket) { 
    socket.emit('notifyData', { hello: 'world' }); 
}); 

,並在客戶端上,你應該有

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://localhost:8000'); 
    socket.on('notifyData', function (data) { 
    alert(data); 
    }); 
</script> 
+0

我嘗試用'io.on('connection',函數(套接字){socket.emit('notifyData',data);''替換socket.emit('notifyData',{hello:'world '}); });',我沒有得到錯誤,但我仍然沒有收到任何客戶端.. –