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に設定するので、接続から受信したデータは標準出力に転送される.