2016-08-25 4 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 (관련 클라이언트 데이터 보유)과 같이 설정할 수 있습니다. 콜백의 그 시리즈, 클라이언트

이 메시지를 전송하는 제 3 자

  • 확인하는 클라이언트
  • 와 통신

    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

    제 3 자 모듈과 통신하는 가장 좋은 방법은 무엇입니까? 내 메인 모듈에 reactor.listenTCP (...)를 호출합니다. 나는 논쟁을 벌릴 수는 있지만, 이것은 한 번만 일어날 수 있습니까? callFromThread와 같은 것을 사용해야합니까? – camerausb

    +0

    "제 3 자 모듈과 통신하는 가장 좋은 방법"은 자신이 무엇인지, 그리고/또는 무엇을하는지 명시하지 않은 제 3 자 모듈에 따라 다릅니다. ''인수를 전달할 수는 있지만 한번만 할 수 있나요? '''보통''connectionMade''는 한 번 호출됩니다 만 여러분이하지는 않습니다. Twisted는이 기능을 호출하여 클라이언트 ** TCP 연결 **을 확인합니다. 나중에 msg를 보내야하는 경우 다른 기능을 사용하거나 연기합니다. ''callFromThread''는 사용하는 gui 모듈에 따라 유용 할 수 있지만 대부분 스레드를 피할 수 있다고 생각합니다. –

    +0

    제 질문은 다른 모듈의 함수 thirdPartyComm에 메시지를 전달하는 방법입니다. 위의 지연 코드는 연결이 이루어질 때 한 번만 실행되는 것 같습니다. 단추를 클릭 할 때마다 (필자는 PyQt를 사용하고있다) 콜백이 필요하다. 프로토콜 클래스의 함수에 액세스하여 지연을 사용하지 않고 self.transport.write (msg)를 사용하여 직접 메시지를 보낼 수 있지만 이렇게하면 dataReceived (self, data)에 아무 것도 표시되지 않습니다. – camerausb