扭曲的客户端协议 - 附加接口前端

时间:2012-07-02 15:50:30

标签: python client twisted

我正在关注在Twisted中编写客户端/服务器对的教程:

http://twistedmatrix.com/documents/current/core/howto/clients.html

我的一切都在为我的客户端和服务器进行通信,系统使用自定义前缀来表示它与“对话”的距离。它最初发送一个json字符串来设置会话,然后逐行发送一个文件。这真的只是一种锻炼而不是其他任何东西。

Client.py:

class ClientProtocol(protocol.Protocol):

    def connectionMade(self):
        json_string = json.dumps({
            'uid':ObjectId(),
            'lat':43.78,
            'lon':-72.5831
        },cls=Encoder)
        self.transport.write('OPN|'+json_string)
        self.fileObject = open('test.csv')

    def sendFile(self):
        lineData = self.fileObject.readline()
        if lineData != '':
            self.transport.write('UPD|')
            self.transport.write(lineData)
        else:
            self.transport.write('EOF|done')

    def dataReceived(self,data):
        if data in ['ELLO','RECVD']:
            self.sendFile()


class ClientFactory(protocol.Factory):
    def buildProtocol(self,addr):
        return ClientProtocol()

if __name__ == '__main__':
    point = TCP4ClientEndpoint(reactor,'localhost',5000)
    d = point.connect(ClientFactory())
    reactor.run()

服务器:

    class TransferProtocol(protocol.Protocol):

        ran = 0

        def connectionLost(self,reason):
            print reason

        def connectionMade(self):
            self.fileObject = open('output','w')

        def dataReceived(self,data):
            methods = {'OPN':'open','UPD':'upload','EOF':'endfile'}
            if data[0:3] in methods.keys():
                func = getattr(self,methods[data[0:3]])
                func(data[4:])

        def open(self,data):
            print 'OPEN %s' % data
            self.transport.write('ELLO')

        def endfile(self,data):
            print 'END %s' % data
            self.transport.loseConnection()

        def upload(self,data):
            self.ran+=1
            self.fileObject.write(data)
            self.transport.write('RECVD')

class myProtocolFactory(protocol.Factory):
    protocol = TransferProtocol

    def doStart(self):
        pass

    def startedConnecting(self, connectorInstance):
        print connectorInstance

    def buildProtocol(self, address):
        print address
        return self.protocol()

    def clientConnectionLost(self, connection, reason):
        print reason
        print connection

    def clientConnectionFailed(self, connection, reason):
        print connection
        print reason

    def doStop(self):
        pass

if __name__ == '__main__':
    reactor.listenTCP(5000, myProtocolFactory())
    reactor.run()

目前,我在一个终端中运行服务器,在另一个终端中运行客户端。正如预期的那样,两个反应堆都启动并通信一次,客户端发送它的标识json,然后是文件内容,然后终止连接。我无法理解的是如何将此协议“挂钩”到cmd接口之类的东西,以使其在一个结束后按命令生成这些进程。因为客户端中的反应器无限期运行,所以它只执行一次网络会话,然后在反应堆中连续循环。

我用Twisted,客户端或服务器构建的所有内容,只响应网络调用,所以我想知道将这个作为“一次性”客户端协议的正确方法是什么,该协议将激活输入命令来自cmd。人们甚至会使用反应堆来做这样的事吗?或者完全扭曲,而不是仅仅手动打开遵循协议的套接字?

修改

我发现在谷歌和SO上钓鱼的Twisted stdio库,但我在将终端输入协议挂接到网络协议时遇到了麻烦。

我有LineReceiver的终端协议继承,并且提示正确显示。我已将网络工厂分配给终端协议的factory对象,然后尝试从提示符调用网络协议的方法。问题是,分配给此属性的连接器对象不使用它应该创建的协议的任何方法。

为了简洁起见,我把它放在GitHub上:

https://github.com/DeaconDesperado/swfty-share/blob/master/client.py

1 个答案:

答案 0 :(得分:1)

否无需外部接线即可将服务器和客户端服务整合在一起。

Twisted提供了必要的方法来确保它可以启动所有服务并在关闭扭曲的应用程序时将其关闭。它提供了这样做的便利。

阅读扭曲应用程序的这篇优秀教程:

  1. http://krondo.com/?p=2345
  2. 阅读以下内容以获取更多详细信息:

    1. http://twistedmatrix.com/documents/current/core/howto/basics.html
    2. http://twistedmatrix.com/documents/current/core/howto/application.html
    3. http://twistedmatrix.com/documents/current/core/howto/plugin.html
    4. http://twistedmatrix.com/documents/current/core/howto/tap.html
    5. 在SO:

      1. Twisted application without twistd