一直受 FLex的安全沙箱困扰,按照网上的很多方法都没能解决,最终原因,怀疑是Twisted的bug,收不到Flex发送的<policy-file-request/>请求,而用Python原始的socket写的则可以收到,实在郁闷。
无奈之下,只好用原生socket写了一个sandBox.py监听843端口专门用来发送安全策略文件,同时修改了一下原有程序适应这个流程,居然测试通过,阿门。
另外增加了一些小功能,比如,退出游戏、服务端统计在线人数等
有小小改变,再帖下代码:
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 15, 2:47 PM
一直受 FLex的安全沙箱困扰,按照网上的很多方法都没能解决,最终原因,怀疑是Twisted的bug,收不到Flex发送的<policy-file-request/>请求,而用Python原始的socket写的则可以收到,实在郁闷。
无奈之下,只好用原生socket写了一个sandBox.py监听843端口专门用来发送安全策略文件,同时修改了一下原有程序适应这个流程,居然测试通过,阿门。
另外增加了一些小功能,比如,退出游戏、服务端统计在线人数等
有小小改变,再帖下代码:
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 12, 11:26 AM
Twisted的异步编程
本文介绍异步编程模块和象征“promised”结果并且提供一个最终结果给响应函数的Twisted的Deferred 抽象。.
本文适用于那些熟悉python语言,并且了解核心网络编程比如servers(服务端)、clients(客户端)和socket(套接字)的新接触Twisted的读者。本文将会让你认识基于twisted的并行模块:非阻塞编程的异步编程的并行编程(多任务)。
接下来我们讨论Deferreds中的并行模块部分,当函数返回一个defeered对象的时候,它处理返回结果的方法。
并行编程介绍
许多计算机任务需要花费一些时间来完成,这里有两个理由来说明为什么一个任务可能花费一些时间:
1、 集中计算(比如大数据的的因式分解)需要花费大量的CPU时间来计算
2、 即使不是集中计算,但不得不等待结果的返回
等待回应
网络编程的一个基本特性是等待数据,想像一下,你有一个发送信息的email函数,这个函数需要连接到远程服务器、等待远程服务器的响应、检测远程服务器是否可以发送email、等待响应、发送email、等待确认、然后断开连接。
任何一步都可能花费一定的时间,你的程序可能使用所有可能模型中最简单的模型,等待数据发送和接收,但这种情况下有显而易见的限制,程序不能同时发送许多email,事实上当发送email的时候程序不能够做任何其它的事。
因此,除了最简单的网络编程之外,我们应该避免使用这种网络编程模型,你可以用几个其它不同的模型使得你的程序在等待一个结果返回的时候仍然可以继续做其它事。
无须等待数据
这里有许多网络编程的模型,主要的几种如下:
1、 为每个连接开辟一个独立的操作系统进程,使得操作系统能够在某个进程等待的时候可以继续处理其它的进程
2、 为每个连接分配一个线程,使得线程框架能够在某个线程等待的时候处理其它线程
3、 使用非阻塞系统在一个线程中处理所有连接
非阻塞调用
非阻塞调用是Twisted中最常用的第三个模块。
当在一个线程中处理许多连接的时候,负责调度应用程序的不是操作系统,通常当各个连接准备读写的时候是通过一个之前注册的函数来处理,即我们通常所说的异步,事件驱动或者基于回调编程。
在这种方式中,之前发送email的方法可能会像下面所说的这样工作:
1、 请求一个连接方法连接远程服务器
2、 这个连接函数马上返回一个通知表明当连接建立的时候已经请求email发送
3、 一旦连接建立,连接方通知email发送函数连接已经准备就绪
相比原始的阻塞队列,上面的方法有什么优势呢?优势就在于当eamil函数不能继续执行下一步操作直到连接建立的时候,程序可以继续执行处理其它任务,比如建立其它的email发送连接。因此,整个程序是不需要等待连接的。
Callbacks(回调)
callback(回调)是通知应用程序数据已经就绪的经典异步模型。应用程序调用一个函数去获取数据,当数据就绪时,调用一个回调函数并且将数据作为该函数的参数。因此回调函数获得返回数据后继续执行之前需要该数据的任务。
Deferreds(延迟)
Twisted 使用Deferred对象来管理回调队列。客户端应用程序绑定一系列的函数到deferred上,当结果通过异步请求返回的时候,这些函数将会被调用(这一系列函数即我们所说的回调或者回调链),同时如果在异步请求中发生错误,一系列函数也将被调用(即错误回调或者错误回调链)。当结果正确返回时,异步库代码调用回调函数,当发生错误时调用错误回调函数,然后Deferred对象会将每个回调或者错误回调的结果传递到这个回调链的下一个函数。
Deferreds 解决的问题
Deferreds旨在帮助解决第二类并发问题-涉及明显的延迟的非计算密集型任务。函数在等待硬盘驱动器访问,数据库访问和网络访问到这一阶段时,有不同的延时。
Deferreds通过给库和应用程序回调一个简单的管理接口,使得Twisted程序在等待获得数据时无须挂起。库总是通过调用Deferred.callback或者错误时调用Deferred.errback.来获得结果。应用程序根据顺序传递给deferreds的callback和errbacks获取结果。
Deferreds背后的基本理念以及其他解决这个问题的方法是尽可能保持CPU的活跃。如果一个任务在等待数据的时候,而不是CPU(和程序)空闲的时候等待数据(这个过程通常称为“阻塞”),在返回这个进程之前,程序同时执行其它的的操作和等待一些准备进行处理的数据。
在Twisted中,调用函数接收到一个延迟等待的函数信号。当数据可用时,程序激活Deferred中的回调函数来处理数据。
Deferreds – 一个暗示数据随后就到的信号
在我们上面发送email的例子中,一个父函数调用一个函数连接远程服务器。异步请求这个连接函数而无须等待结果使得父函数能够做其它事。但父函数或控制程序如何知道这个连接不存在和当连接存在时如何使用这个连接呢?
Twisted有一个通知情况的对象,当连接函数返回时,这个对象通过返回一个twisted.internet.defer.Deferred对象通知这个操作是未完成的。
Deferred 有两个目的。第一,它说“我是一个无论你想要我做什么都是等待的信息”。第二,当数据到达时你可以请求延迟做某些事情。
Callbacks(回调)
未完待续……
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 12, 10:20 AM

» 阅读全文
Submitted by 夜雨飘零 on 2009, September 12, 10:17 AM
Twisted的愿景
许多其他文档都试图去定义什么是Twisted,当我明白我使用twisted的目标的时候,我所要诠释的不是Twisted是什么,而是Twisted应该是什么。
首先,Twisted 应该是有趣的。它开始于一个游戏,曾经并将继续应用于商业游戏中,为终端用户提供交互性和娱乐性的体验
Twisted是一个开发网络应用的平台。同时python自身是一个非常强大的语言,有许多其他语言需要花费很大精力才能获得的工具。现在这不是问题了;Twisted是一个良好的(有几分特质的)基于用户需求不断完善的python 框架和类库。
作为一个平台,Twisted应该关注整合。理想的,所有功能都应该通过协议实现。遗憾的是,所有功能都应该用一个无缝的一致的用户接口构建在至少一个协议里。开发的下一步将会将注意力放到把不同的当前结构统一到配置系统上,并且允许它们自动统一到一起。
原文:http://twistedmatrix.com/projects/core/documentation/howto/vision.html
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 12, 10:08 AM
目录
介绍
概述
图解结构
Twisted的异步编程
Twister Internet
教程
写一个TCP服务端
写一个TCP客户端
建立TwistedQuotes 应用
设计一个Twisted 应用
教程:从零开始Twisted
1、 Finger进化论:创建一个简单的finger服务
2、 Finger进化论:为finger服务增加新特性
3、 Finger进化论:整理finger的代码
4、 Finger进化论:移动到系统的组件中
5、 Finger进化论:可插入的后端
6、 Finger进化论:一个简单的web前端
7、 Finger进化论:利用透明代理的twisted客户端支持
8、 Finger进化论:多协议使用单一工厂
9、 Finger进化论:一个Twisted finger客户端
10、 Finger进化论:编译一个finger库
11、 Finger进化论:配置和打包finger服务端
低级网络事件循环
基本Recator(反射器)
UDP网络
使用进程
使用Deferreds(延迟)
创建Deferreds
深入Deferreds
调度
使用threads(线程)
高效大容量流
选择一个反射器和集成工具包
高级Twisted
帮助程序和脚本
Twisted的插件机制
为twistd编写Twisted应用插件
接口和适配器(组件构架)
可信任的插件式认证
使用application
实用程序
命令行解释器
logging
使用Dirbm:基于目录的存储
telnet连接Twisted服务端
使用Trial为twsited代码编写测试的小技巧
Twisted 关系型数据库管理系统支持
使用adbapi的Twisted 数据库支持
列数据库抽象
透明代理
Twisted 扩展
透明代理介绍
使用透明代理
传递复杂类型
通过透明代理进行身份认证
附录
字典
使用emace调试的技巧
原文:http://twistedmatrix.com/projects/core/documentation/howto/index.html
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 11, 9:54 AM
这是python win32模块自带的例子。
如果你已经安装python win32模块,可以找这个目录:C:\Python25\Lib\site-packages\win32\Demos\win32gui_taskbar.py,还有C:\Python25\Lib\site-packages\win32\Demos\win32gui_menu.py,这个看起来功能更多.
» 阅读全文
Submitted by 夜雨飘零 on 2009, September 9, 9:07 AM
用Python的网络编程框架Twisted实现服务端,前端用Flex实现,通过Socket进行通信。
主要实现的功能:建立socket连接通信,聊天同步,同屏移动等简单的MMORPG元素。
程序很简单,但是因为twisted和flex都是从零开始学起的,python也只是学过几天语法,
所以做起来比看起来艰难得多,通过这个Demo,也基本了解了这几门技术的基本用法,算是没折折腾吧。
废话不说,上代码...
» 阅读全文
Submitted by 夜雨飘零 on 2009, August 24, 5:29 PM
编写一个简单的服务器端的步骤如下:
python 编写server的步骤:
第一步是创建socket对象。调用socket构造函数。如:
socket = socket.socket( family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:
socket.bind( address )
由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
第三步是使用socket套接字的listen方法接收连接请求。
socket.listen( backlog ) #接收客户端的请求
backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
connection, address = socket.accept()
调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
if __name__ == '__main__':
import socket
#1.第一步是创建socket对象。调用socket构造函数。
mysocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的
mysocket.bind(('localhost',8008))
#3.第三步是使用socket套接字的listen方法接收连接请求。
mysocket.listen(5)
while True:
#4.第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
connection,address = mysocket.accept()
try:
connection.settimeout(5)
#5.第 五步是处理阶段,服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。
buf = connection.recv(1024)
if buf == '1':#接收到的如果为1就走这一步了!
connection.send('welcome to server')
else:
connection.send('please go out')
except socket.timeout:
print 'time out'
#6.传输结束,服务器调用socket的close方法关闭连接。
connection.close()
按照步骤来看一下客户端的实现步骤吧!
使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
socket.connect( (host,port) )
host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
if __name__ == '__main__':
import socket
#1.创建一个socket以连接服务器:socket = socket.socket( family, type )
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.使用socket的connect方法连接服务器
sock.connect(('localhost',8008))
import time
time.sleep(2)
#3.处理阶段,客户和服务器将通过send方法和recv方法通信。
sock.send('1')
print sock.recv(1024)
sock.close()
如果能够按照这几个步骤就可以实现一个简单的服务器与客户端了!
DEMO程序如下:
» 阅读全文