twisted-送受信データ

2668 ワード

from twisted.internet import stdio, reactor, protocol

from twisted.protocols import basic

import re



class DataForwardingProtocol(protocol.Protocol):

    def __init__(self):

        self.output = None

        self.normalizeNewlines = False



    def dataReceived(self, data):

        if self.normalizeNewlines:

            data = re.sub(r"(\r
|
)", "\r
", data) if self.output: self.output.write(data) class StdioProxyProtocol(DataForwardingProtocol): def connectionMade(self): inputForwarder = DataForwardingProtocol( ) inputForwarder.output = self.transport inputForwarder.normalizeNewlines = True stdioWrapper = stdio.StandardIO(inputForwarder) self.output = stdioWrapper print "Connected to server. Press ctrl-C to close connection." class StdioProxyFactory(protocol.ClientFactory): protocol = StdioProxyProtocol def clientConnectionLost(self, transport, reason): reactor.stop( ) def clientConnectionFailed(self, transport, reason): print reason.getErrorMessage( ) reactor.stop( ) if __name__ == '__main__': import sys if not len(sys.argv) == 3: print "Usage: %s host port" % __file__ sys.exit(1) reactor.connectTCP(sys.argv[1], int(sys.argv[2]), StdioProxyFactory( )) reactor.run( )

 
 
 E:\test>python test.py www.hao123.com 80Connected to server.  Press ctrl-C to close connection.
 
 
DataForwardingProtocolクラスの定義から、データを受信するたびにselfが呼び出される.output.writeはselfにデータを渡す.output(任意のオブジェクトの書き込み方法)です.DataForwardingProtocolのnormalizeNewLines属で、trueに設定すると、UnixスタイルのN改行をRNのより標準的なネットワークプロトコルで使用される改行に標準化します.DataForwardingProtocolのサブクラスとして、StdioProxyProtocolは設定を完了し、接続が確立すると、inputForwardingProtocolというDataForwardingProtocolのインスタンスを確立し、出力をselfに設定する.次にパッケージinputForwarderをtwistedとします.internet.stdioの例では、inputForwarderを標準のI/Oにフックしてネットワーク接続の代わりに、標準入力から受信したデータをStdioProxyProtocolネットワーク接続に転送し、最後に、StdioProxyProtocolの出力属性をstdioWrapperに設定するので、接続から受信したデータは標準出力に転送される.