使用NodeJS进行服务器端推送

时间:2015-04-20 14:35:06

标签: node.js socket.io

我想使用NodeJS实现服务器端推送功能。 目前,我想要的只是一个侦听特定网址请求的服务器(例如http://localhost:8000/inputData?data=hello

发出此请求后,我希望所有查看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

之前做一组操作

2 个答案:

答案 0 :(得分:1)

您的服务器上存在设计问题,因为根本没有定义socket变量。如果您尝试做的是在任何人点击该特定URL时向所有客户广播,那么您可以通过以下方式进行:

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

如果您尝试向单个客户端套接字发送,那么您必须找到一种方法来确定您尝试发送到的io.sockets命名空间中的哪个套接字。

答案 1 :(得分: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>