使用Socket IO(或Strophe.js),XMPP和Django进行实时服务器推送

rbu*_*hum 11 django xmpp comet strophe socket.io

我写了几个Android和iOS原生移动应用程序,它直接连接到我托管的XMPP服务器.他们通过XMPP推送和提取实时数据.我还使用了一些XMPP XEP扩展.对于其他操作,我在同一服务器上运行django应用程序,所有移动应用程序都通过HTTP REST接口使用该服务器.我使用Celery和Redis为django方面异步进行一些操作(比如对我的数据库进行大量的批量写入).

这一切都很好,花花公子.好极了.

但是现在我想为所有这些编写一个Web前端,所以我开始研究我的选择并且很好 - 有很多方法可以让我想要首先检查SO社区.

有一个js库给我一个统一的套接字通信API的想法(即尝试不同的Web套接字实现或回退到flash)吸引我,因此我提到了Socket IO.必须运行nodejs服务器的想法,不是那么多(还有一件事需要学习),但如果必须的话,我肯定会.我知道有些人使用gevent作为节点服务器的替代品.其他人,决定写一个小nodejs,他们连接到他们的堆栈的其余部分.我可能会这样做.

另一种选择是使用像Strophe这样的js XMPP库,我认为它不具备闪回后备功能.另外,我需要研究这对我的服务器意味着什么.

我已经阅读了关于如何做彗星和django的几个Stackoverflow答案 - 因此为什么看起来有几个选项.

问题是:

如果我想拥有Socket IO行为的优势(使用回退)并且我想将实时数据推送到Web客户端(通过XMPP送到服务器),并使用Django我最好的选择是什么?

更新:我使用的XMPP服务器是ejabberd,它也支持BOSH.我意识到我可以使用Strophe.js,因此我的通信将通过一种长轮询http连接而不是websockets.据我所知,Websockets上有一些XMPP开源库,但AFAIK社区并不像SocketIO那样活跃.

更新2:我需要支持的浏览器只是现代浏览器.我想这意味着Flash后备不会那么重要,这让我倾向于strophe.js.

cri*_*eys 8

我想,一旦你弄清楚某个节点,你就会发现从socket获取socket.io会变得更加困难.在节点准备就绪中有非常容易使用的xmpp模块(参见https://github.com/astro/node-xmpp).请记住,节点都是javascript,因此您可能已熟悉其中的编程.

就个人而言,我使用节点0.6或更高版本时遇到了一些内存泄漏问题.Node 0.4没有遇到这些问题.如果你是github的新手(就像我在使用Node之前那样),这里是你如何使用节点服务器.

获取节点

  1. 登录你的linux盒子和喜欢的目录(我假设/)
  2. git clone https://github.com/joyent/node.git
  3. cd/node
  4. git tag -l(这将列出所有可用的节点版本)
  5. git checkout v0.6.16(这将检查0.6.16版本的节点,你可以用v0.4.12替换它,例如,如果你有内存问题)
  6. ./配置
  7. 使
  8. make install

您需要某些开发工具来构建它,例如g ++,但此时您将拥有一个工作node命令.

安装像xmpp这样的节点模块

Node有很多模块,大部分内容都是为你编写的.http://search.npmjs.org上有一个搜索工具,或者您可以使用该npm命令直接从shell访问所有模块.NPM是用于安装和管理节点模块的节点工具.例如,您可以键入npm search xmpp以搜索所有xmpp模块.要为节点安装基本的xmpp库,您可以这样做npm install node-xmpp.顺便说一句,大多数github节点模块页面将包含首页自述文件的说明.

保持节点在生产中运行

我刚开始时就把它扔了.如果你有任何未捕获的错误,节点就会死掉.因此,您可以1.确保没有任何错误或者它们都被捕获(不太可能因为即使Node本身也会出错)2.使用uncaughtException处理程序来捕获这些问题.您可以在程序中使用这样的代码

process.addListener("uncaughtException", function (err) {
    util.log("Uncaught exception: " + err);
    console.log(err.stack);
    console.log(typeof(this));
    // maybe email me?

});
Run Code Online (Sandbox Code Playgroud)

永远安全,永远使用

即使出现uncaughtException问题,您的生产程序也可能会死亡.内存耗尽,段错误,谁知道什么.这就是使用名为"Forever"的精彩节点模块所付出的代价(请参阅https://github.com/nodejitsu/forever).您可以键入npm install forever -g以永久安装.请注意-g选项,它永远放在GLOBAL节点模块目录中.如果没有-g,它会将节点模块放在当前工作目录中.然后你就可以键入类似的东西(假设你的节点程序名为my_program.js)forever start my_program.js,然后Forever程序将确保如果它死了就会重新启动.


Joe*_*and 5

如果你打算做BOSH(XEP-0124,XEP-0206),那就不知道为什么你需要Flash后备,这就是strophe.js所做的.如果你不需要支持IE7,你可以从strophe.js 做CORS,你甚至不需要同源的代理.IE6将起作用,因为它不安全,IE8 +支持一种刚刚工作的CORS形式.

要通过XMPP从django获取信息到您的客户端,请使用您喜欢的Python XMPP库(例如Django应用程序中的SleekXMPP)与您的服务器建立组件连接(XEP-0114).为了性能(即不为每个客户端连接创建一个新连接),安排该连接相对长寿.根据需要发送协议.

您没有提到您正在使用的XMPP服务器.不支持BOSH的XMPP服务器变得越来越少,但是如果你有一个,你可能需要Punjab作为BOSH到XMPP代理,或者你可能想要切换到更新的服务器,例如Prosody.