Twisted клиент для протокола только для отправки, который допускает разрыв - PullRequest
2 голосов
/ 12 октября 2010

Я решил окунуться в мир асинхронного питона с помощью закрученного.Я реализовал некоторые примеры из документации, но мне трудно найти пример очень простого клиента, который я пытаюсь написать.

Короче, я хотел быклиент, который устанавливает tcp-соединение с сервером, а затем отправляет простые «\ n» завершенные строковые сообщения из объекта очереди на сервер.Сервер никогда не отвечает ни на какие сообщения, поэтому мой клиент полностью однонаправлен.Я / думаю / что я хочу получить комбинацию этого примера и удобного протокола twisted.internet.protocols.basic.LineReceiver.Такое ощущение, что это должно быть просто самое простое, что можно сделать в витой, но ни одна из документации или примеров, которые я видел в Интернете, кажется, не совсем подходит.

1 Ответ

1 голос
/ 12 октября 2010

То, что я сделал, не использует Очередь, но я иллюстрирую код, который отправляет строку после установления соединения. Существует множество материалов для печати, которые помогут вам понять, что происходит.

Обычный импортный материал:

from twisted.web import proxy
from twisted.internet import reactor
from twisted.internet import protocol
from twisted.internet.protocol import ReconnectingClientFactory 
from twisted.protocols import basic
from twisted.python import log
import sys
log.startLogging(sys.stdout)

Вы создаете протокол, полученный из линейного приемника, устанавливаете разделитель. В этом случае я просто пишу строку «www» после установления соединения. Главное - взглянуть на интерфейс протокола по адресу twisted.internet.interface.py и понять различные методы протокола и то, что они делают и когда они вызываются.

class MyProtocol(basic.LineReceiver):

    #def makeConnection(self, transport):
    #    print transport       

    def connectionLost(self, reason):
        print reason
        self.sendData = False

    def connectionMade(self):
        print "connection made"
        self.delimiter = "\n"
        self.sendData = True
        print self.transport
        self.sendFromQueue()

    def sendFromQueue(self):
        while self.sendData:
            msg = dataQueue.get()
            self.sendLine(msg)
            # you need to handle empty queue
            # Have another function to resume 

Наконец, фабрика протоколов, которая будет создавать экземпляр протокола для каждого соединения. Посмотрите на метод: buildProtcol.

class myProtocolFactory():
    protocol = MyProtocol

    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

Теперь для подключения используется соединитель:

reactor.connectTCP('localhost', 50000, myProtocolFactory())
reactor.run()

Я запустил это и подключил его к серверу, который просто печатает то, что он получает, и, следовательно, не отправляет подтверждение обратно. Вот вывод:

1286906080.08   82     INFO 140735087148064 __main__ conn_made: client_address=127.0.0.1:50277
1286906080.08   83    DEBUG 140735087148064 __main__ created handler; waiting for loop
1286906080.08   83    DEBUG 140735087148064 __main__ handle_read
1286906080.08   83    DEBUG 140735087148064 __main__ after recv
'www\n'

Recieved: 4

Приведенный выше пример, если не отказоустойчив. Чтобы восстановить соединение в случае потери соединения, вы можете получить фабрику протоколов из существующего витого класса - ReconnectingClientFactory. В Twisted есть почти все инструменты, которые вам понадобятся:)

class myProtocolFactory(ReconnectingClientFactory):
    protocol = MyProtocol

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

Для дальнейшего использования

Предлагаю вам прочитать: http://krondo.com/?page_id=1327

[Отредактировано: согласно комментарию ниже]

...