向DHCP服务器发送命令

时间:2016-08-25 01:50:50

标签: python tcp twisted

我有一个简单的扭曲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界面操作),它定义了要发送的消息,这条消息需要作为'msg'传递给connectionMade

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

您的第三方通话将在connectionMade发生,不应直接拨打。 connectionMade是一个Twisted回调,它表示客户端在另一侧。由你决定之后发生的事情。所以你可以做一些事情,比如制作一系列Deferred s /回调,其中self.transport(这包含相关的客户数据)。在这些系列的回调中,你将拥有

的逻辑
  1. 与第三方沟通
  2. 验证客户端
  3. 向客户发送消息
  4. 这是它的要点:

    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)