[問題] 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