- 论坛徽章:
- 0
|
小弟最近在看twisted的学习资料,对于deferred的编程一直不是很理解。希望大大指点一下,万分感谢。
1.比如下面这段代码,我连接上服务端然后请求一个任务,接收到数据后运用deferred根据head来判断做哪一个任务,但做完任务,有产生一些数据,我不知道怎么主动传到服务器,难道要在protocol里面实现吗?
2.protocol.dataReceived()接收到的数据是一次完整的self.transport.write()的数据吗?还是要等conncetionLost回调函数被调用才算整个完整的数据包?
3.是不是每个单独的事务都各自实现一个protocol和factory类,然后用Deferred的回调函数里面再调用connectionTCP来执行另外一个事务。还是整个client和server就各自实现一个protocol和factory类?
4.平常这个Deferred怎么使用或者代码中的哪个位置使用,有没有什么好的资料或者代码可以给我学习一下。谢谢了。- class MyClientProtocol(Protocol):
- def connectionMade(self):
- self.send_jsondata(None)
- def send_jsondata(self, data):
- json_data = {'head': 00006, 'client': 00001, 'cmd_id': 123}
- send_data = json.dumps(json_data)
- self.transport.write(send_data)
- def dataReceived(self, data):
- try:
- recv_data = json.loads(data)
- except:
- print 'Failed loads data'
- self.factory.process_data(recv_data)
- def connectionLost(self, reason):
- print reason
- class MyClientFactory(ClientFactory):
- protocol = MyClientProtocol
- def __int__(self):
- self.d = Deferred()
- def process_data(self, recv_data=None):
- d.callback(recv_data)
- def process_event(recv_data):
- if recv_data['head'] == 00012:
- opener = Urllib2Opener()
- username = recv_data['username']
- password = recv_data['password']
- login = Login(opener=opener, username=username, passwd=password)
- print login.login()
- def conn_server(host, port):
- factory = MyClientFactory()
- from twisted.internet import reactor
- reactor.connectTCP(host, port, factory)
- return factory.d
- if __name__ == '__main__':
- d = conn_server('127.0.0.1', 8007)
- d.addCallback(process_event)
复制代码 |
|