3

私は Twisted が初めてで、以下を実装する方法を見つけようとしています。クライアントからメッセージを受け取るサーバーがあります。ただし、このサーバーは、メッセージを受信した後、クライアントから別のサーバーにメッセージを送信します。したがって、次のようになります。

Client --->   Server1  --->   Server2

したがって、Server1 は本質的に、サーバーとクライアントの両方として機能します。ただし、Server1 が Server2 に情報を送信した後、Server1 を Server2 から切断したいと考えています。どうすればこれができるかわかりません。

私が今取り組んでいるのは、サーバー1に情報を送信するクライアントです。次に、入力を少し変更してから、サーバー 2reactor.connectTCP()に正常に接続して情報を送信します。問題は、Server1 を完全にシャットダウンせずに接続を閉じる方法です。使用してみtransport.loseConnection( )ましたが、Server2から切断するとServer1がシャットダウンします。

何らかの形で利用しようと考えているのですreactor.spawnProcess()が、うまくいきません。私が見たところ、接続を閉じるとプロセスが閉じられるため、別のプロセスで connectTCP を実行できれば、他のプロセスには影響しません。

これが私のコードです

import time, datetime
import re
from twisted.internet import stdio, reactor, protocol
from twisted.protocols import basic

result = 'The AT message is unavailable (no previous talk with client)'

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\n|\n)", "\r\n", data)
        if self.output:
            self.output.write(data)

class StdioProxyProtocol(DataForwardingProtocol):
    global result
    def connectionMade(self):
        inputForwarder = DataForwardingProtocol()
        inputForwarder.output = self.transport
        inputForwarder.normalizeNewlines = True
        stdioWrapper = stdio.StandardIO(inputForwarder)
        self.output = stdioWrapper
        self.transport.write(result)
        self.transport.loseConnection( )

class StdioProxyFactory(protocol.ClientFactory):
    protocol = StdioProxyProtocol

    def clientConnectionLost(self, transport, reason):
        reactor.stop()

    def clientConnectionFailed(self, transport, reason):
        print reason.getErrorMessage()
        reactor.stop()

class EchoProtocol(basic.LineReceiver):

    def dataReceived(self, line):
      #Do stuff with the input sent from the client.  This is irrelevant to my problem.
                #UPDATE OTHER SERVERS
                reactor.connectTCP('localhost', 12771, StdioProxyFactory())   

class EchoServerFactory(protocol.ServerFactory):
    protocol = EchoProtocol

if __name__ == "__main__":
    port = 12770
    reactor.listenTCP(port, EchoServerFactory( ))
    reactor.run( )

ありがとうございました!

4

1 に答える 1

7

reactor.stop()呼び出しのためではなく、ファクトリのclientConnectionLost()メソッドを呼び出すため、Server1 がシャットダウンしていtransport.loseConnection()ます。最初の発信接続が失われるとすぐにリアクター全体をシャットダウンしたくないでしょう。

于 2013-03-09T15:03:25.767 に答える