Twisted разделяет переменную между протоколами tcp / udp - PullRequest
1 голос
/ 30 декабря 2011

У меня есть следующий простой пример tcpserver.Я рассчитываю поделиться счетчиком коэффициентов var с сервером udp, чтобы при каждом подключении он включал значение как для tcp, так и для udp.Так что, если я сначала соединюсь с tcp, это будет 2, затем, если я соединюсь с портом на udp .. это будет 3

#!/usr/bin/env python

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class TCP(Protocol):

    def connectionMade(self):
        self.factory.counter += 1
        self.transport.write(str(self.factory.counter)+'\r\n')
        self.transport.loseConnection()

class QOTDFactory(Factory):

    def __init__(self, protocol='tcp'):
        if protocol == 'tcp':
            self.protocol = TCP
        else:
            self.protocol = UDP

        self.counter = 1

reactor.listenTCP(8007, QOTDFactory('tcp'))
#reactor.listenUDP(8007, QOTDFactory('udp'))

reactor.run()

Моя главная проблема - запуск класса UDP, который будет работать параллельно.это моя точка отсчета.Я думаю, как я ссылаюсь на счетчик в порядке и будет работать

Ответы [ 3 ]

3 голосов
/ 01 января 2012

Аргументом reactor.listenUDP должен быть экземпляр DatagramProtocol, как показано в примере UDP: http://twistedmatrix.com/documents/current/core/howto/udp.html. Вы не можете использовать QOTDFactory с UDP, поэтому ему не нужен TCPпротив логики выбора UDP.Вместо этого просто создайте подкласс DatagramProtocol с желаемой логикой протокола и предоставьте ему ссылку на фабрику, используемую вашим сервером TCP.

#!/usr/bin/env python

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class StreamCounter(Protocol):
    def connectionMade(self):
        self.factory.counter += 1
        self.transport.write(str(self.factory.counter)+'\r\n')
        self.transport.loseConnection()


class DatagramCounter(DatagramProtocol):
    def __init__(self, factory):
        self.factory = factory

    def datagramReceived(self, data, address):
        self.factory.counter += 1
        self.transport.write(str(self.factory.counter), address)


class QOTDFactory(Factory):
    counter = 0
    protocol = StreamCounter


factory = QOTDFactory()
reactor.listenTCP(8007, factory)
reactor.listenUDP(8007, DatagramCounter(factory))

reactor.run()

Я переименовал TCP и UDP в StreamCounter и DatagramCounter, поскольку они не ограничены использованием с TCP и UDP соответственно (и это не были ужасные описательные имена;).Например, вы сможете использовать StreamCounter поверх SSL, используя также reactor.listenSSL.

1 голос
/ 03 января 2012

Это работает для ваших нужд?

#!/usr/bin/env python

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class Counter():
  def __init__(self):
    self.count = 0

class TCP(Protocol):

    def connectionMade(self):
        self.factory.counter.count += 1
        self.transport.write(str(self.factory.counter)+'\r\n')
        self.transport.loseConnection()

class QOTDFactory(Factory):

    def __init__(self, protocol, counter):
        if protocol == 'tcp':
            self.protocol = TCP
        else:
            self.protocol = UDP

        self.counter = counter

counter = Counter()
reactor.listenTCP(8007, QOTDFactory('tcp', counter))
reactor.listenUDP(8007, QOTDFactory('udp', counter))

reactor.run()
0 голосов
/ 30 декабря 2011

Вы можете использовать статическую переменную класса для реализации этого счетчика:

class QOTDFactory(Factory):
    counter = 1

    def __init__(self, protocol='tcp'):
        if protocol == 'tcp':
            self.protocol = TCP
        else:
            self.protocol = UDP

        QOTDFactory.counter += 1
...