Python 的服务器推送解决方案:Orbited + RabbitMQ

标签: python 服务器 推送 | 发表时间:2011-08-24 21:35 | 作者:(author unknown) 非狐外传
出处:http://simple-is-better.com/

最近公司要用到服务器推送技术,google了一下,nodejs固然好,但是公司的东西都是python搞的,

所以选择了python的 Orbited +  RabbitMQ,无奈Orbited文档极其缺乏,所以要做下笔记。

以下都是在windows平台上搞的测试。原理:

Orbited的安装:

pip install Twisted Orbited stomp.py

RabbitMQ:先要装好Erlang,然后下RabbitMQ的win版exe文件安装,由于要用到stomp协议,

所以要下两个插件amqp_client-2.5.1.ez,rabbitmq_stomp-2.5.1.ez,

丢到rabbitmq\plugins目录下,然后在C:\Documents and Settings\CZ.Chen\Application Data\RabbitMQ放一个rabbitmq.config,内容为

[
  {rabbitmq_stomp, [{tcp_listeners, [{"127.0.0.1", 61613}]}]}
].

然后启用这两个插件,启动RabbitMQ服务。

下面回到python,框架用了TG2,我已经建了个叫comet的项目,在comet下放一个chat.ini,来配置Orbited

[listen]
# this is the server which provides the socket-proxy for javascript
http://:9000
# the following enables the MorbidQ STOMP Message Queue
#stomp://:61613

[access]
# allow incoming HTTP requests on port 9000 to connect to
# localhost:61613 (i.e. the MorbidQ STOMP server)
# The * refers to the
#* -> localhost:61613
* -> localhost:61613

[global]
session.ping_interval = 300

然后在controllers\root.py加入代码,我省略了一些代码,代码如下:

# -*- coding: utf-8 -*-
"""Main Controller"""
from tg import expose, flash, require, url, request, redirect, response
from pylons.i18n import ugettext as _, lazy_ugettext as l_
from tgext.admin.tgadminconfig import TGAdminConfig
from tgext.admin.controller import AdminController
from repoze.what import predicates

from comet.lib.base import BaseController
from comet.model import DBSession, metadata
from comet import model
from comet.controllers.secure import SecureController

from comet.controllers.error import ErrorController

import stomp
import json

###rabbitmq
conn = stomp.Connection([('0.0.0.0', 61613), ('127.0.0.1', 61613)], 'guest', 'guest')
print conn
conn.start()
conn.connect(wait=True)
conn.subscribe(destination='/topic/rfid', ack='auto')
###########
__all__ = ['RootController']

class RootController(BaseController):
     
    @expose('comet.templates.chat')
    def chat(self):
        """Handle the front-page."""
        return {}
   
    @expose('json')
    def add_msg(self, **kw):
        print kw
        conn.send(
            json.dumps({'msg': kw.get('msg', '')}),   
            destination='/topic/rfid')
        return {}

其中要把orbited包下的static目录copy一份改名为orbited,放到comet项目的comet\public目录下,

然后在templates再增加一个template:chat.mak, 代码如下:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="/orbited/JSON.js"></script>
<script type="text/javascript" src="/orbited/Orbited.js"></script>
<script type="text/javascript">
    // This line is required to allow our chat server and this
    // page to operate on different ports...
    document.domain = document.domain;
    // Establish the port and server for the Orbited server
    Orbited.settings.port = 9000;
    Orbited.settings.hostname = "127.0.0.1";
   
    Orbited.loggers['Orbited.TCPSocket'].enabled = true;
    Orbited.settings.log = true
    // Enable streaming operation
    Orbited.settings.streaming = true;
    // This object is referenced by stomp.js
    TCPSocket = Orbited.TCPSocket;
</script>
<script type="text/javascript" src="/orbited/protocols/stomp/stomp.js"></script>
<script type="text/javascript">
    var add_message = function( text ) {
        var node = $('<div class="chat-message"></div>');
        node.append( text['msg'] );
        $('.chat-trace').append( node );
    };
    $(document).ready( function() {
        stomp = new STOMPClient();
        stomp.onconnectedframe = function(frame) {
            stomp.subscribe( "/topic/rfid" );
        };
        stomp.onmessageframe = function( frame ) {
            add_message( JSON.parse(frame.body) );
            //add_message( frame.body );
        };
        stomp.connect('localhost', 61613, 'guest', 'guest');
        $('.chat-entry .chat-trigger').click( function() {
            var chatter = $('.chat-entry .chatter');
            var value = chatter.attr( 'value' );
            if (value.length) {
                //stomp.send( value, "/messages" );
                $.post("/add_msg", {"msg": value});
                chatter.attr( 'value', '' );
            }
        });
    });
</script>

  <div id="chat">
    <h2>Real-time Chat</h2>
    <div class="chat-trace">
    </div>
    <div class="chat-entry">
        Chat:
        <input class="chatter" />
        <button class="chat-trigger">Send</button>
    </div>
  </div>

然后切换到comet项目的目录下,运行orbited --config=chat.ini,启动orbited, 

然后再运行paster serve --reload development.ini启动TG2,

然后浏览器打开两个页面:http://127.0.0.1:8080/chat, 就可以实时聊天啦。。。

# 来源:Coz.Blog


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [python 服务器 推送] 推荐:

Python 的服务器推送解决方案:Orbited + RabbitMQ

- 非狐外传 - python.cn(jobs, news)
最近公司要用到服务器推送技术,google了一下,nodejs固然好,但是公司的东西都是python搞的,. 所以选择了python的 Orbited +  RabbitMQ,无奈Orbited文档极其缺乏,所以要做下笔记. 以下都是在windows平台上搞的测试. RabbitMQ:先要装好Erlang,然后下RabbitMQ的win版exe文件安装,由于要用到stomp协议,.

简易的python web服务器用途

- Ruby - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: 简易的python web服务器用途. 我们在工作中经常会需要看下报表,如tsung的统计报表或者lcov的覆盖情况,这些报表通常为了方便都会作成html格式的. 我们可以把这些html网页打包拉回去用浏览器慢慢看,但是每次都要打包,拉数据非常麻烦.

Go 和 Python Web 服务器性能对比

- Ken - python.cn(jobs, news)
我通常使用 Python 来构建 Web 应用. 一年前,在兴趣的驱使下,我开始学习 Go. 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同 thttpd 服务器一起的应用. 我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具.

Python 和 PHP 的 Web 服务器性能测试

- 非狐外传 - python.cn(jobs, news)
这几天一直在玩虚拟机,测了几种Python和PHP的Web服务器的性能,顺便记录下来. 宿主:MacBook Pro MC700. 操作系统:Mac OS X 10.6.8. CPU: 2.3GHz Intel Core i5(双核). 虚拟机:Virtual Box. 操作系统:Linux version 2.6.32-5-686 (Debian 2.6.32-35).

Python和PHP的Web服务器性能测试

- phus - keakon的涂鸦馆
这几天一直在玩虚拟机,测了几种Python和PHP的Web服务器的性能,顺便记录下来. 宿主:MacBook Pro MC700. 操作系统:Mac OS X 10.6.8. CPU: 2.3GHz Intel Core i5(双核). 虚拟机:Virtual Box. 操作系统:Linux version 2.6.32-5-686 (Debian 2.6.32-35).

用 Python 脚本实现对 Linux 服务器的监控

- - 博客 - 伯乐在线
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件)、glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写.

使用Pushlet将消息从服务器端推送到客户端

- - 企业架构 - ITeye博客
使用Pushlet来实现服务器端向客户端推送信息. 1.         通过配置文件来实现定时的从服务器端向客户端推送信息. 2.         通过API主动向另外一端推送信息. 在开始测试之前,有三点非常重要,需要实现讲明,否则程序将会无法正常运行:. 2.1.     JSP页面上的设定.

推送通知iOS客户端编写实现及推送服务器端编写

- - CSDN博客移动开发推荐文章
推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商. 下面我们看看开发之前的一些准备工作. 编写iOS推送应用需要在Xcode工程中进行一些配置,这些配置是主要是设置代码签名标识,代码签名标识的前提要有配置概要文件(Provisioning Profiles).

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.

Python调试

- - 企业架构 - ITeye博客
原文地址: http://blog.csdn.net/xuyuefei1988/article/details/19399137. 1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:. IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:.