0

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

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

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

客户端.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接口之类的东西,以使其在结束后根据命令生成这些进程。因为客户端中的reactor无限运行,它执行一次网络会话,然后在reactor中不断循环。

我曾经用 Twisted、客户端或服务器构建的所有东西,都只是响应网络调用,所以我想知道什么是正确的方法来使它成为一个“一次性”客户端协议,该协议将在来自cmd. 甚至有人会将反应堆用于这样的事情吗?或者完全扭曲,而不是仅仅手动打开遵循协议的套接字?

编辑

我在 google 和 SO 上发现了 Twisted stdio 库,但我无法将终端输入协议连接到网络协议。

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

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

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

4

1 回答 1

1

否 无需外部布线即可将您的服务器和客户端服务连接在一起。

Twisted 提供了必要的方法来确保它可以启动所有服务并在您关闭一个扭曲的应用程序时将它们关闭。它提供了执行此操作的工具。

阅读这个关于扭曲应用程序的优秀教程:

  1. http://krondo.com/?p=2345

阅读以下内容了解更多详情:

  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

在这样:

  1. 无扭曲的扭曲应用
于 2012-07-02T16:14:49.517 回答