##language:zh ''' Otter 目标代码框架! ''' -- Zoom.Quiet [<>] <> = 目标 = ''生成框架中的uss*和usp*'' * [[http://wiki.woodpecker.org.cn/moin.cgi/Otter_2fOtterBase?action=AttachFile&do=get&target=OtterBase-040814|OtterBase-040814下载]] --修改扩展为 rar, winrar 3.2以上版本! == benchmarks框架结构 == === uss === ==== message ==== ==== protocols ==== = otter 2.0 = == ussd.py == 我暂时无法收发邮件,所以把对otter 2.0 的服务端流量控制的尝试发到wiki上讨论。 {{{ #!python # -*- coding: utf-8 -*- # # # $Id: ussd.py,v 1.8 2004/09/14 12:45:00 hoxide Exp $ """$,1$U现了(BUSS德腄aemon程序 """ from uss.message import usspmsg from uss.protocols import ussp from twisted.internet import reactor, protocol from time import clock import Queue import thread class USSServerProtocol(ussp.USSProtocol): """建立$,1){嘎?(BUSS服务器的协议处理""" """ def __init__(self): ussp.USSProtocol.__init__(self) """ funs={ 'connect': lambda self, m: self.p_ussp_connect(m), 'mail_counter': lambda self, m: self.p_ussp_mail_counter(m), 'terminate': lambda self, m: self.p_ussp_terminate(m) } def connectionMade(self): """建立连接?$,1%#?R舳疾蛔?(B""" print 'connectionMade' self.funs=USSServerProtocol.funs def on_ussp_connect(self, message): getqueue.put((self, 'connect', message)) def on_ussp_mail_counter(self, message): getqueue.put((self, 'mail_counter', message)) def on_ussp_terminate(self, message): getqueue.put((self, 'terminate', message)) def p_ussp_connect(self, message): """处理?$,1&[Щ?(Bconnect报文""" smessage = usspmsg.USSPMessage() smessage.head.sequence = message.head.sequence smessage.setMsgName('connect_resp') smessage.body.setField('status',1) smessage.body.setField('version',1) self.sendData(smessage.packed()) def p_ussp_mail_counter(self, message): """处理?$,1&[Щ⒗吹?(Bmail_counter报文""" smessage = usspmsg.USSPMessage() smessage.head.sequence = message.head.sequence smessage.setMsgName('mail_counter_resp') smessage.body.setField('uid',message.body.fields['uid']) smessage.body.setField('number',2028) self.sendData(smessage.packed()) def p_ussp_terminate(self, message): """处理?$,1&[Щ?(Bterminate报文""" smessage = usspmsg.USSPMessage() smessage.head.sequence = message.head.sequence smessage.setMsgName('terminate_resp') self.sendData(smessage.packed()) # 完事了!!!?$,1'?>的连接 self.transport.loseConnection() class USSServerFactory(protocol.ServerFactory): """USS服务器工厂""" protocol = USSServerProtocol import time def processData(queue): while 1: """ if queue.empty(): print 'sleep 1 sec' time.sleep(1) continue """ #print 'to get' m = queue.get(block=True) #print 'get' m[0].funs[m[1]](m[0], m[2]) getqueue = Queue.Queue(100) #thread.start_new(processData, (getqueue,)) reactor.callInThread(processData, getqueue) def main(): f = USSServerFactory() reactor.listenTCP(7890, f) reactor.run() if __name__ == "__main__": main() }}} 有点乱码,和我emacs的设置问题有关。 == 测试 == 客户端的WINMAX设到1000000,就几乎等于客户端没开窗口。 {{{ H:\OpenGNS\BENCHM~1>ussc.py Connect successfully Connection lost 测试数据: 4095 搪 收到 4095 搪 最后收德絬id为B?094 勇檬保潞2.14 寐 每秒:1917.559960搪 H:\OpenGNS\BENCHM~1>ussc.py Connect successfully Connection lost 测试数据: 4095 搪 收到 4095 搪 最后收德絬id为B?094 勇檬保潞2.54 寐 每秒:1611.171839搪 H:\OpenGNS\BENCHM~1>ussc.py Connect successfully Connection lost 测试数据: 8191 搪 收到 8191 搪 最后收德絬id为B?190 勇檬保潞5.05 寐 每秒:1621.519510搪 H:\OpenGNS\BENCHM~1>ussc.py Connect successfully Connection lost 测试数据: 16383 搪 收到 16383 搪 最后收德絬id为B?6382 勇檬保潞13.89 寐 每秒:1179.812285搪 }}} 这个只是曲起点,我测了一下0xfff的情况,只有40多条每秒, 要考虑其他办法,比如服务器和发送者之间流量控制的配合 程序使用了线程。具体参见twisted的[[http://wiki.woodpecker.org.cn/moin.cgi/PyTwisted_2fLowLevelNetworkingEventLoop_2fLLNEL9]]