2016-08-25 3 views
0

私は、別のアプリケーションからデータを送受信するために使用している単純なねじれTCPサーバーを持っています。私は接続が確立されたら、このアプリケーションに連絡してメッセージを送信することができます。ねじれたサーバーにコマンドを送信します。

私ができるようにしたいのは、(接続されているときではなく)サードパーティのアプリケーションに送信するとき、および何を外部モジュールコマンドにするかです。たとえば、ここに私のサーバーコードです:

from twisted.internet import reactor, protocol 

# Twisted 
class Tcp(protocol.Protocol): 
    def dataReceived(self, data): 
     self.transport.write(data) 
     print 'data received: ', data 
     # do something with data 


    def connectionMade(self, msg): 
     # Want to only transport message when I command not immediately when connected 
     self.transport.write(msg) 


class TcpFactory(protocol.Factory): 
    def buildProtocol(self, addr): 
     return Tcp() 

reactor.listenTCP(8001, TcpFactory()) 
reactor.run() 

私は(GUIインタフェースが運営)、別のモジュールを持って送信するためにどのようなメッセージを定義し、このメッセージは

connectionMade

に「MSG」として渡される必要がありますこれを行う最善の方法は何ですか?

答えて

0

サードパーティの通話はconnectionMadeから発生し、直接呼び出さないでください。 connectionMadeはTwistedコールバックであり、クライアントが反対側にいることを知らせるためにそこにあります。それ以降に何が起こるかは、あなた次第です。だから、一連のDeferred /コールバックをself.transport(これは関連するクライアントデータを保持する)にするようなことができます。コールバックのこれらのシリーズでは、あなたがクライアント

これにメッセージを送信するサードパーティ

  • 検証し、クライアント
  • と通信

    1. ためのロジックを持っているだろうことは、それの要旨であります:

      def connectionMade(self): 
          d = Deferred() 
          d.addCallback(self.thirdPartyComm).addErrBack(self.handleError) 
          d.addCallback(sendMsg) 
          d.callback(self.transport) 
      
      def thirdPartyComm(self, transport): 
          # logic for talking to 3rd party goes here 
          # 3rd party should validate the client then provide a msg 
          # or raise exception if client is invalid 
          return msg 
      
      def handleError(self, error): 
          # something went wrong, kill client connection 
          self.transport.loseConnection() 
      
      def sendMsg(self, msg): 
          self.transport.write(msg) 
      
  • +0

    私のサードパーティのモジュールと通信する最も良い方法は何ですか?私はreactor.listenTCP(...)をメインモジュールに呼んでいます。私は議論を通過することができますが、これは一度だけ起こることができますか?私はcallFromThreadのようなものを使うべきですか? – camerausb

    +0

    「サードパーティのモジュールと通信する最善の方法」は、サードパーティのモジュール(あなたが何であるか、そして/または何をしているのかを明記していない)に依存します。 ''私は引数を渡すことができますが、これは一度しか起こりませんか? ''通常、 '' connectionMade''は一度呼び出され、それはあなたによって行われません。 Twistedはこの機能を呼び出してクライアント** TCP接続**を確認します。後でmsgを送信する必要がある場合は、別の関数を使用してメッセージを送信するか、遅延します。 '' callFromThread''はあなたが使用しているguiモジュールに応じて役に立つかもしれませんが、私たちはほとんどのスレッドを避けることができると思います。 –

    +0

    私の質問は、別のモジュールの関数thirdPartyCommにメッセージを渡す方法です。上の遅延コードは、接続が確立されたときに一度しか実行されないようです。ボタンがクリックされるたびにコールバックが必要になります(私はPyQtを使用しています)。私はプロトコルクラスの関数にアクセスし、遅延を使用せずにself.transport.write(msg)で直接メッセージを送信できますが、これを行うとdataReceived(self、data)に何も取得されません。 – camerausb

    関連する問題