Otter 目标代码框架!

-- Zoom.Quiet [2004-08-15 22:40:43]

1. 目标

生成框架中的uss*和usp*

1.1. benchmarks框架结构

1.1.1. uss

1.1.1.1. message

1.1.1.2. protocols

2. otter 2.0

2.1. ussd.py

  • 我暂时无法收发邮件,所以把对otter 2.0 的服务端流量控制的尝试发到wiki上讨论。

   1 # -*- coding: utf-8 -*-
   2 #
   3 #
   4 # $Id: ussd.py,v 1.8 2004/09/14 12:45:00 hoxide Exp $
   5 """$,1$U现了(BUSS德腄aemon程序
   6 """
   7 
   8 from uss.message import usspmsg
   9 from uss.protocols import ussp
  10 from twisted.internet import reactor, protocol
  11 from time import clock
  12 
  13 import Queue
  14 import thread
  15 
  16 class USSServerProtocol(ussp.USSProtocol):
  17     """建立$,1){嘎?(BUSS服务器的协议处理"""
  18     """
  19     def __init__(self):
  20         ussp.USSProtocol.__init__(self)
  21     """
  22     funs={
  23             'connect': lambda self, m: self.p_ussp_connect(m),
  24             'mail_counter': lambda self, m: self.p_ussp_mail_counter(m),
  25             'terminate': lambda self, m: self.p_ussp_terminate(m)
  26             }
  27     def connectionMade(self):
  28         """建立连接?$,1%#?R舳疾蛔?(B"""
  29         print 'connectionMade'
  30         self.funs=USSServerProtocol.funs
  31     def on_ussp_connect(self, message):
  32         getqueue.put((self, 'connect', message))
  33     def on_ussp_mail_counter(self, message):
  34         getqueue.put((self, 'mail_counter', message))
  35     def on_ussp_terminate(self, message):
  36         getqueue.put((self, 'terminate', message))
  37 
  38     def p_ussp_connect(self, message):
  39         """处理?$,1&[Щ?(Bconnect报文"""
  40         smessage = usspmsg.USSPMessage()
  41         smessage.head.sequence = message.head.sequence
  42         smessage.setMsgName('connect_resp')
  43         smessage.body.setField('status',1)
  44         smessage.body.setField('version',1)
  45         self.sendData(smessage.packed())
  46 
  47     def p_ussp_mail_counter(self, message):
  48         """处理?$,1&[Щ⒗吹?(Bmail_counter报文"""
  49         smessage = usspmsg.USSPMessage()
  50         smessage.head.sequence = message.head.sequence
  51         smessage.setMsgName('mail_counter_resp')
  52         smessage.body.setField('uid',message.body.fields['uid'])
  53         smessage.body.setField('number',2028)
  54         self.sendData(smessage.packed())
  55 
  56     def p_ussp_terminate(self, message):
  57         """处理?$,1&[Щ?(Bterminate报文"""
  58         smessage = usspmsg.USSPMessage()
  59         smessage.head.sequence = message.head.sequence
  60         smessage.setMsgName('terminate_resp')
  61         self.sendData(smessage.packed())
  62         # 完事了!!!?$,1'?>的连接
  63          self.transport.loseConnection()
  64 
  65 class USSServerFactory(protocol.ServerFactory):
  66     """USS服务器工厂"""
  67     protocol = USSServerProtocol
  68 
  69 import time
  70 def processData(queue):
  71     while 1:
  72         """
  73         if queue.empty():
  74             print 'sleep 1 sec'
  75             time.sleep(1)
  76             continue
  77         """
  78         #print 'to get'
  79         m = queue.get(block=True)
  80         #print 'get'
  81         m[0].funs[m[1]](m[0], m[2])
  82 
  83 getqueue = Queue.Queue(100)
  84 
  85 #thread.start_new(processData, (getqueue,))
  86 reactor.callInThread(processData, getqueue)
  87 
  88 def main():
  89     f = USSServerFactory()
  90     reactor.listenTCP(7890, f)
  91     reactor.run()
  92 
  93 if __name__ == "__main__":
  94     main()

有点乱码,和我emacs的设置问题有关。

2.2. 测试

客户端的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