介绍python twisted框架知识点,逻辑实现以及demo下载
twisted框架介绍:
twisted是一个用python语言写的事件驱动的网络框架,他支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。
twisted实现主要包括三个部分:reactor,protocol,factory。
反应器(reactor): 反应器用来执行事件循环,分发事件处理等等,每个应用程序中一般只能启动一个reactor。
协议(protocol): 协议用来完成与一个已经连接成功的主机的交互功能,主要有数据的接收和发送功能。连接的断开事件也可以在这里处理。比较常用的子类是twisted.protocols.basic.LineReceiver类。
工厂(factory): 工厂负责与一个协议的启动和关闭功能,而且还负责在连接成功时生成一个协议对象,(by gashero)用于与远程主机的交互功能。
逻辑实现:
自定义工厂类ServiceFactory,继承父类工厂类protocol.Factory:
class ServiceFactory(protocol.Factory):
# 重写父类方法,构造协议对象,并给协议对象添加一个factory属性指向工厂
def buildProtocol(self, addr):
return ReceiverService(self)
自定义协议类ReceiverService,推荐继承的父类协议类basic.LineReceiver:
class PayService(basic.LineReceiver):
# 初始化, factory是传过来的工厂对象
def __init__(self,factory):
pass
# dataReceived函数用来接收客户端数据
def dataReceived(self, data):
pass
# 连接成功事件,可重载
def connectionMade(self):
pass
# 连接断开事件,可重载,依靠reason区分断开类型
def connectionLost(self,reason):
pass
相关方法使用说明:
self.transport # 用于数据发送的传输对象,这个是所有的协议对象都有的成员
self.transport.write(data) # 发送数据到客户端
self.transport.loseConnection() # 关闭连接
self.transport.getPeer() # 获取客户端信息,ip,连接id
self.transport.getHost() # 获取本机信息
使用reactor执行事件循环:
# 端口号,工厂对象,监听数
reactor.listenTCP(8888, ServiceFactory(), 50)
if __name__ == '__main__':
print '执行了reactor.run()'
reactor.run()
执行启动命令:python service.py
使用守护进程application,在后台运行服务器:
if __name__ == '__main__':
main()
elif __name__ == '__builtin__':
reactor.callLater(1, main)
application = service.Application('service') # 创建Application对象
开启守护进程命令:
启动twisted守护进程命令:twistd -y service.py --pidfile=pay_service.pid -l ./service.log
service.py: 服务器文件
pay_service.pid:端口文件
service.log:日志文件
相关联知识点:
处理二进制数据,比如,存取文件,socket操作时,可以使用python的struct模块来完成.可以用struct来处理c/c++语言中的结构体。
struct.unpack :接收处理客户端发来的数据c结构体的字符串字节流,解析出来的是tuple格式
struct.pack :把tuple格式数据封装成字符串字节流,用于发送给客户端
! : 转换为网络字节对齐符,用于网络传输二进制,表示要使用网络字节顺序解析
网络字节顺序:按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题
short和long型有小端和大端之分,char是1个字节,不受主机字节序和网络字节序的影响
htonl():无符号long,网络字节序转本地字节序
ntohl():无符号long,本地字节序转网络字节序
htons():无符号short,网络字节序转本地字节序
ntohs():无符号short,本地字节序转网络字节序
threads.deferToThread(function):非租塞线程,功能和callInThread一样,区别是 deferToThread 可以返回一个deferred对象,从而允许你设定回调函数。
def __init__(self):
print '执行了ServiceFactory'
# 开启线程函数
self.deferRun()
def deferRun(self):
# 设置线程函数
d = threads.deferToThread(self.deferFunc)
# 设置线程回调函数
d.addCallback(self.deferCallback)
def deferFunc(self):
print '执行了deferFunc'
# deferCallback回调函数里接收执行线程逻辑后的结果
return 'result'
def deferCallback(self, result):
# result是deferFunc返回的结果
print '执行了deferCallback, result = ', result
addCallback(callback):返回成功回调或者默认的失败回调
addErrback(callback):返回错误回调或者默认的成功回调
addBoth(callback):返回具体的错误回调或者正确回调
demo下载,实现客户端服务端通讯协议: 点击下载demo
原创博客,如转载请附加说明。
本文介绍了Python的Twisted框架,它是一个事件驱动的网络框架,支持多种协议。文章详细讲解了反应器、协议和工厂的实现,并提供了自定义工厂类和服务协议的示例。此外,还提到了struct模块在处理二进制数据中的作用,以及如何进行网络字节序转换。最后,提供了客户端服务端通讯协议的demo下载。
9419

被折叠的 条评论
为什么被折叠?



