Витой единый сервер соединений - PullRequest
0 голосов
/ 10 декабря 2018

Я извращенный новичок.

Что я хочу, так это установить одно соединение на стороне сервера.По сути, я хочу, чтобы новые соединения ожидали обработки данных, пока не будет установлено первое соединение.Я не хочу, чтобы он отклонял новые соединения, я просто хочу, чтобы соединения обрабатывались сервером последовательно.

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

Я знаю, что могу проверить количество подключений в connectionMade, перейти в спящий режим и проверить еще раз.Мне нужно, чтобы данные обрабатывались в том порядке, в котором они были получены, поэтому мне нужно было бы добавить еще один счетчик, который также отслеживал бы положение соединения.Это кажется очень неуклюжим решением.Есть ли другой способ сделать это?

Это quoteserver.py

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

class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        self.factory.numConnections += 1

    def dataReceived(self, data):
        print "Number of active connections: %d" % (
        self.factory.numConnections,)
        print "> Received: ``%s''\n> Sending: ``%s''" % (
        data, self.getQuote())
        self.transport.write(self.getQuote())
        self.updateQuote(data)

    def connectionLost(self, reason):
        self.factory.numConnections -= 1

    def getQuote(self):
        return self.factory.quote

    def updateQuote(self, quote):
        self.factory.quote = quote

class QuoteFactory(Factory):
    numConnections = 0
    def __init__(self, quote=None):
        self.quote = quote or "An apple a day keeps the doctor away"
    def buildProtocol(self, addr):
        return QuoteProtocol(self)

reactor.listenTCP(8000, QuoteFactory())
reactor.run()

Это quoteclient.py

from twisted.internet import reactor, protocol

class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        self.sendQuote()

    def sendQuote(self):
        self.transport.write(self.factory.quote)

    def dataReceived(self, data):
        print "Received quote:", data
        self.transport.loseConnection()

class QuoteClientFactory(protocol.ClientFactory):
    def __init__(self, quote):
        self.quote = quote

    def buildProtocol(self, addr):
        return QuoteProtocol(self)

    def clientConnectionFailed(self, connector, reason):
        print 'connection failed:', reason.getErrorMessage()
        maybeStopReactor()

    def clientConnectionLost(self, connector, reason):
        print 'connection lost:', reason.getErrorMessage()
        maybeStopReactor()

def maybeStopReactor():
    global quote_counter
    quote_counter -= 1
    if not quote_counter:
        reactor.stop()

quotes = [
 "You snooze you lose",
 "The early bird gets the worm",
 "Carpe diem"
]
quote_counter = len(quotes)

for quote in quotes:
    reactor.connectTCP('localhost', 8000, QuoteClientFactory(quote))
reactor.run()
...