[问题] twisted 如何知道资料收完?

楼主: zha0 (这个帐号是挂网用)   2015-02-11 16:42:00
这是从 http://twistedmatrix.com/ 的范例程式里面改的, 之前都用 socket 的 send, recv 在写, 但现在改成了 event 的方式,
首先有 dataReceived, 但是没有 dataSend or dataWrite 可以用, 所以只能靠 connectionMade 来做第一次的传送,
但问题来了, 传完之后, 希望可以在 dataReceived 收完 Server 那里传完的资料, 之后再做一次 self.transport.write() 的动作,
但又会不确定 server 那里会丢什么资料过来, 因为 server 的版本不一样,回传回来的东西会不一样, 是有想到一个方法,
就是看所有的 server 版本, 看回传什么东西, 来做一个 seq, 如果 server 那里传完的话就会知道 .
ex: 你丢一个封包过去, server 会回你 5 个, 再 dataReceived 做一个 count 算到 5 时,就表示 server 传完了,
但觉得这样有点呆, 所以不知 twisted 有没有 callback 之类的 method, 可以再 server 那里不传送资料后, client 这里才开始传资料过去 .
有想到说用 callLater 的方式, 来 delay 一下, 不过觉得这方法也不是很好, 也许有人会觉得这问题是在 AP 层应该要自己要协义好的,
但问题是卡在, server 那边有很多是未知的.
from twisted.internet import reactor, protocol
class EchoClient(protocol.Protocol):
def __init__(self):
pass
def connectionMade(self):
self.transport.write('test')
def dataReceived(self, data):
print "%08X" % len(data)
# self.transport.loseConnection()
def connectionLost(self, reason):
print "connection lost"
class EchoFactory(protocol.ClientFactory):
protocol = EchoClient
def clientConnectionFailed(self, connector, reason):
print "Connection failed - goodbye!"
reactor.stop()
def clientConnectionLost(self, connector, reason):
print "Connection lost - goodbye!"
reactor.stop()
def main():
f = EchoFactory()
reactor.connectTCP("192.168.1.2", 12345, f)
reactor.run()
# reactor.callLater(2, transport)
if __name__ == '__main__':
main()
楼主: zha0 (这个帐号是挂网用)   2015-02-11 18:19:00
翻 Twisted Network Programming Essentials, 2nd 中

Links booklink

Contact Us: admin [ a t ] ucptt.com