2

クライアント:

#!/usr/bin/env python

from twisted.internet import reactor, protocol

class EchoClient(protocol.Protocol):
    def __init__(self, arg):
        self.arg = arg

    def connectionMade(self):
        self.transport.write("hello, world!")

    def dataReceived(self, data):
        print "Server said:", data
        self.transport.loseConnection()

    def connectionLost(self, reason):
        print "connection lost"

class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient

    def buildProtocol(self, address):
        proto = protocol.ClientFactory.buildProtocol(self, address, 12)
        self.connectedProtocol = proto
        return proto

    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("localhost", 8000, f)
    reactor.run()

if __name__ == '__main__':
    main()

サーバ:

#!/usr/bin/env python

from twisted.internet import reactor, protocol
from twisted.application import service, internet

class Echo(protocol.Protocol):
    def dataReceived(self, data):
        self.transport.write(data)

def main():
    factory = protocol.ServerFactory()
    factory.protocol = Echo
    reactor.listenTCP(8000,factory)
    reactor.run()

if __name__ == '__main__':
    main()

エラー:

exceptions.TypeError: buildProtocol() takes exactly 2 arguments (3 given)

質問:

EchoClientでクラスを取得して、パラメーターを受け入れ、インスタンス変数 (上記のコンストラクターのCLIENTarg など) を割り当てるにはどうすればよいですか? EchoClient以下に示すように、関数をオーバーライドすることが以前に提案されていbuildProtocolましたが、そうしようとした結果、上記のエラーが発生しました。ここからどこへ行けばいいのかよくわかりません。私の質問は次のように一般化できると思います:インスタンス変数をプロトコルに追加するにはどうすればよいですか?

4

2 に答える 2

1

あなたの質問からは、正確に何を試み、正確にエラーが何であったかは明確ではありませんとにかく2つのステップを実行する必要があります:

  1. MakeEchoClientのコンストラクターは、必要な引数を取り、初期化する必要があるフィールドを初期化します。
  2. ファクトリのメソッドをオーバーライドbuildProtocolして、これらの引数をプロトコルに提供します。
于 2013-06-02T08:04:08.527 に答える