使用python twisted框架实现长连接通讯

本文介绍了Python的Twisted框架,它是一个事件驱动的网络框架,支持多种协议。文章详细讲解了反应器、协议和工厂的实现,并提供了自定义工厂类和服务协议的示例。此外,还提到了struct模块在处理二进制数据中的作用,以及如何进行网络字节序转换。最后,提供了客户端服务端通讯协议的demo下载。

介绍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


原创博客,如转载请附加说明。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值