Nodejs和一个简单的web页面消息推送服务

来源:互联网 发布:手机pdf朗读软件 编辑:程序博客网 时间:2024/05/01 10:13

前言:

英语能力有限,所以不能叫做纯翻译,大概比例是70%翻译,20%理解,10%自由发挥

原文:

http://www.gianlucaguarini.com/blog/nodejs-and-a-simple-push-notification-server/

简述:

用socket.io建立服务端和客户端的双向连接,当服务端的xml文件发生变化时,向客户端推送xml内容

------------- start -----------------------

在本文中我将向你展示如何使用nodejs和socket.io创建一个push(推送)服务。通常如果我们想更新web应用的一些内容,我们采用javascript论询(timer)或者简单地使用AJAX请求web服务以此来实现更新页面内容。这对于小用户量的应用来说是个不错的解决方案,但是使用这种方法当大量用户同一时间在你的页面会怎么样?


你应该知道,AJAX请求=客户端请求头(header)+服务端响应头(response header)+数据(data)。(更多关于此的信息请见这篇文章websocket performance(websocket性能))。所以如果你的web应用有大量用户使用大量AJAX请求来下载更新内容,甚至可能包含一些不需要更新的无用AJAX请求,你的服务器会被迫支持大量不必要的轮询。解决这个大问题你可能有两个解决方案:

1、你是google,所以你有大量的服务器群允许你做任何无用功、允许你挥霍、浪费

2、你潇洒地使用跨浏览器解决方案构建一个简洁的推送消息服务。

下面我将向你展示如何构建一个简洁的消息推送服务,先从代码开始。首先你需要在你的服务器上安装nodejs。然后对于这个实例我们需要引用socket.io和xml2js两个nodejs模块到我们的项目中。你可以通过命令行使用"npm(node包管理node package manager)"安装任意的nodejs模块,像这样:

$ npm install socket.io$ npm install xml2json

下面新建一个server.js文件,它包含所有将运行在服务器上的nodejs代码。

var app = require('http').createServer(handler),  io = require('socket.io').listen(app),  parser = new require('xml2json'),  fs = require('fs');// 创建一个服务,端口号是8000 ( localhost:8000 )app.listen(8000);console.log('server listening on localhost:8000');// 加载 client.html 页面function handler(req, res) {  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);  });}// creating a new websocket to keep the content updated without any AJAX requestio.sockets.on('connection', function(socket) {  console.log(__dirname);  // watching the xml file  fs.watchFile(__dirname + '/example.xml', function(curr, prev) {    // 如果xml文件发生了改变,读取xml文件    fs.readFile(__dirname + '/example.xml', function(err, data) {      if (err) throw err;      // xml转换为json      var json = parser.toJson(data);      // 发送新的数据到客户端      socket.volatile.emit('notification', json);    });  });});

创建一个简单的example.xml文件。


<span style="font-size:18px;"><?xml version="1.0" encoding="ISO-8859-1"?><test>    <sample>Hello world!</sample></test></span>

最后你可以自由地创建你的前端页面client.html,当example.xml发生变化时会你的数据将会被推送。

<html>    <head>    <!--     * Author:      Gianluca Guarini     * Contact:     gianluca.guarini@gmail.com     * Website:     http://www.gianlucaguarini.com/     * Twitter:     @gianlucaguarini    -->        <title>Push notification server</title>    </head>    <body>        <time></time>        <div id="container">Try to change your xml data to update this content</div>    <script src="socket.io/socket.io.js"></script>    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>    <script>    // creating a new websocket    var socket = io.connect('http://localhost:8000');    // on every message recived we print the new datas inside the #container div    socket.on('notification', function (data) {        // convert the json string into a valid javascript object        var _data = JSON.parse(data);        $('#container').html(_data.test.sample);        $('time').html('Last Update:' + new Date());    });    </script>    </body></html>

【此处作者还提供了个视频,需要翻墙看,在youtube】

正是因为有socket.io才有了这个简单又跨平台的解决方案,我们在html页面和服务器间创建了一个双向连接,只有xml发生改变时才会推送新的数据,可以利用的技术包括新的websocket api甚至是回退到flash技术(更多socket.io去这里)

下载教程

如果你喜欢这篇文章,你可以读我的新文章——如何让你的Nodejs推送消息服务连接mysql数据库。


---------------- end --------------------

其实我要找的是app的安卓推送,跑偏了==!


0 0
原创粉丝点击