Один одноранговый объект обрабатывает несколько клиентов - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть код сервер-клиент, использующий TCP и Twisted. Я хочу, чтобы первый созданный одноранговый объект ( по порядку первого подключенного клиента ) работал (* 1005) * отправлять сообщения ) также будущие будущие клиенты. Поэтому я сохраняю первый узел (глобальный список) и использую его для всех последующих соединений, но он обслуживает только первого клиента (, к которому он подключен ), игнорируя остальные.

Как сделать так, чтобы одноранговый узел обслуживал всех подключенных клиентов одновременно? ( Я протестирую его не более чем для 3 клиентов ).

def connectionMade(self):
            global connectedList
    if self.pt == 'client':
        self.connected = True
    else:                 
        print "Connected from", self.transport.client
        try:
            self.transport.write('<connection up>')
        except Exception, e:
            print e.args[0]
        self.ts = time.time()
        reactor.callLater(5, self.sendUpdate)

    connectedList.append(self.transport) # add peer object




def sendUpdate(self):
            global updateCounter, connectedList
    print "Sending update"
    try:
                    updateCounter += 1
                    print(connectedList[0])
                    # Send updates through first connected peer
                    connectedList[0].write('<update ' + str(updateCounter) + '>')
    except Exception, ex1:
        print "Exception trying to send: ", ex1.args[0]
    if self.connected == True:
        reactor.callLater(5, self.sendUpdate)

1 Ответ

0 голосов
/ 04 ноября 2018

для обслуживания (отправки сообщений) будущих будущих клиентов

Это предложение трудно понять. Моя интерпретация заключается в том, что вы хотите, чтобы sendUpdate отправлял сообщения всем клиентам, кроме первого (по заказу при подключении).

но обслуживает только первый клиент

Это так же сложно. Моя интерпретация заключается в том, что вы наблюдаете поведение, при котором только первый клиент (заказанный при подключении) получает любые сообщения от сервера.

Вот ваш код для отправки сообщений клиентам:

connectedList[0].write('<update ' + str(updateCounter) + '>')

Обратите внимание, что этот код всегда отправляет сообщение на connectedList[0]. Таким образом, он только отправляет сообщение одному клиенту - независимо от их количества - и всегда выбирает first client в connectedList (что соответствует первому клиенту для подключиться к серверу).

Возможно, вы захотите что-то еще подобное:

for c in connectedList[1:]:
    c.write('<update ' + str(updateCounter) + '>')

Обратите внимание, как это отправляет сообщение более чем одному клиенту.

Кроме того, независимо от вашего вопроса, вам следует прекратить использование глобальных переменных и избегать использования чистого ITransport в качестве интерфейса протокола.

...