使用Socket IO(或Strophe.js)、XMPP和Django的实时服务器推送
我编写了两个Android和iOS本机移动应用程序,它们直接连接到我托管的XMPP服务器。他们通过XMPP推拉实时数据。我还使用了一些。对于其他操作,我有一个django应用程序运行在同一台服务器上,所有移动应用程序都通过HTTP REST接口使用该服务器。我在django端使用芹菜和Redis异步执行一些操作(比如对我的数据库执行大量批处理写入) 这些都很好用。耶 但是现在我想为所有这些写一个网络前端,所以我开始研究我的选择,好吧,有很多方法可以剥猫皮,我想先和so社区核实一下 有一个js库为套接字通信提供了一个统一的API(即尝试web套接字的不同实现或退回到flash)的想法吸引了我,因此我提到了socket IO。必须运行nodejs服务器的想法,嗯,没有那么多(还有一件事需要学习),但如果我必须这样做,我肯定会这样做。我知道有些人用。其他人,决定写一篇文章。我可能会这样做 另一个选择是使用js XMPP库,我认为它没有闪存回退功能。此外,我还需要研究这对我的服务器意味着什么 我已经阅读了一些关于如何做comet和django的Stackoverflow答案——因此,似乎有几种选择 问题是: 如果我想利用Socket IO行为的优势(具有回退功能),并且想将实时数据推送到web客户端(通过XMPP提供给服务器),并使用Django,那么我的最佳选择是什么? 更新:我使用的XMPP服务器是,它也支持。我意识到我可以使用,因此我的通信将通过一种长轮询http连接而不是WebSocket。据我所知,有一些,但很抱歉,社区没有SocketIO社区活跃使用Socket IO(或Strophe.js)、XMPP和Django的实时服务器推送,django,xmpp,socket.io,comet,strophe,Django,Xmpp,Socket.io,Comet,Strophe,我编写了两个Android和iOS本机移动应用程序,它们直接连接到我托管的XMPP服务器。他们通过XMPP推拉实时数据。我还使用了一些。对于其他操作,我有一个django应用程序运行在同一台服务器上,所有移动应用程序都通过HTTP REST接口使用该服务器。我在django端使用芹菜和Redis异步执行一些操作(比如对我的数据库执行大量批处理写入) 这些都很好用。耶 但是现在我想为所有这些写一个网络前端,所以我开始研究我的选择,好吧,有很多方法可以剥猫皮,我想先和so社区核实一下 有一个js库为
更新2:我需要支持的浏览器只是现代浏览器。我想这意味着Flash回退不会那么重要,这让我倾向于strophe.js。不知道如果你要做BOSH(,),为什么需要Flash回退,strophe.js就是这么做的。如果不需要支持IE7,可以从strophe.js开始,甚至不需要相同来源的代理。IE6之所以能工作是因为它不安全,而IE8+只支持勉强工作的CORS形式 要通过XMPP从django向您的客户机获取信息,请使用您的收藏夹(例如从django应用程序)与服务器建立组件连接()。为提高性能,将该连接安排为相对较长的寿命(即不要为每个客户端连接创建新的连接)。根据需要发送协议
您没有提到您正在使用的XMPP服务器。不支持BOSH的XMPP服务器越来越少了,但如果您有一个,您可能需要作为BOSH到XMPP的代理,或者您可能想切换到更新的服务器,例如。我认为一旦您被某个节点弄脏了手,您会发现从节点到socket.io将变得更加困难。node ready to go中有非常易于使用的xmpp模块(请参阅)。记住,node都是javascript,所以您可能已经熟悉了其中的编程 就我个人而言,我在使用节点0.6或更高版本时遇到了一些内存泄漏问题。节点0.4没有出现这些问题。如果您是github新手(就像我在玩Node之前一样),下面是如何使用Node服务器的 获取节点
节点
命令
安装像xmpp这样的节点模块
Node有大量的模块,其中大部分内容都已经为您编写好了。有一个搜索工具,您可以使用npm
命令直接从shell访问所有模块。NPM是用于安装和管理节点模块的节点工具。例如,您可以键入npmsearchxmpp
来搜索所有xmpp模块。要为节点安装基本的xmpp库,您需要执行npm install node xmpp
。顺便说一下,大多数github节点模块页面都会在首页自述文件中包含说明
保持节点在生产中运行
当我第一次出发的时候,这让我很震惊。如果您有任何未捕获的错误,则节点将简单地死亡。所以,你可以
1.确保没有任何错误,或者它们都被捕获(不太可能,因为即使节点本身也会出错)
2.使用uncaughtException处理程序捕获这些问题。您会在程序中使用这样的代码
process.addListener("uncaughtException", function (err) {
util.log("Uncaught exception: " + err);
console.log(err.stack);
console.log(typeof(this));
// maybe email me?
});
格外安全,永远使用
即使存在未捕获的异常问题,生产中的程序也可能会死亡。内存不足,故障,谁知道呢。这就是使用像奇妙的节点模块“永远”这样的东西的好处(请参阅)。您可以键入npm永远安装-g
永远安装。请注意-g选项,它将永远放在全局节点模块目录中。如果没有-g,它会将节点模块放在当前工作目录中。然后,您可以键入类似这样的内容(假设您的节点程序名为my_program.js)永久启动my_program.js
,然后永久程序将确保如果死亡,它将重新启动。我们使用的是实时