Несколько вызовов / ответных сообщений между Twisted сервером / клиентом - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть базовый сервер и клиент, реализованный в Twisted.Моя цель состоит в том, чтобы клиент обработал некоторые данные, сообщил о своем прогрессе обратно на сервер и повторял до тех пор, пока все данные не будут обработаны.Клиент может отправить начальное сообщение на сервер, но не получает ответа от сервера, давая ему понять, что все в порядке, чтобы начать обработку этих данных.Вот код, который у меня есть.

Сервер:

from twisted.internet import reactor, protocol

PORT = 9000

progress = 0

class MyServer(protocol.Protocol):

    def dataReceived(self, data):
        global progress
        print(data)
        if data != "Ready?":
            progress = int(data)
        self.transport.write("Got it.")
        self.transport.loseConnection()

    def connectionLost(self, reason):
        global progress
        if progress == 10:
            print("Completed.")
            reactor.stop()

class MyServerFactory(protocol.Factory):
    protocol = MyServer

factory = MyServerFactory()
reactor.listenTCP(PORT, factory)
reactor.run()

Клиент:

from twisted.internet import reactor, protocol
import time

HOST = 'localhost'
PORT = 9000

progress = 0

class MyClient(protocol.Protocol):

    def connectionMade(self):
        self.transport.write("Ready?")
        self.transport.loseConnection()

    def dataReceived(self, data):
        global progress
        progress += 1
        print(progress)
        self.transport.write(str(progress))
        self.loseConnection()

    def connectionLost(self, reason):
        global progress
        if progress == 10:
            print("Completed.")
            reactor.stop()

class MyClientFactory(protocol.ClientFactory):
    protocol = MyClient

factory = MyClientFactory()
reactor.connectTCP(HOST, PORT, factory)

reactor.run()

1 Ответ

0 голосов
/ 22 февраля 2019

Я понял, что моя проблема в том, что я преждевременно закрывал соединение.В более раннем тестировании я пытался отправить несколько сообщений в функции dataReceived, которые объединялись в одно сообщение.Это заставило меня поверить, что вы должны потерять связь для каждого сообщения, чтобы пройти.Скорее, вам просто нужно дать функции завершиться перед отправкой другого сообщения.Вот обновленный код, который работает по назначению.

Сервер:

from twisted.internet import reactor, protocol

PORT = 9000

progress = 0

class MyServer(protocol.Protocol):

    def dataReceived(self, data):
        global progress
        print(data)
        if data != "Ready?":
            progress = int(data)
        self.transport.write("Got it")
        if progress == 10:
            self.transport.loseConnection()

    def connectionLost(self, reason):
        print("Completed.")
        reactor.stop()

class MyServerFactory(protocol.Factory):
    protocol = MyServer

factory = MyServerFactory()
reactor.listenTCP(PORT, factory)
reactor.run()

Клиент:

from twisted.internet import reactor, protocol
import time

HOST = 'localhost'
PORT = 9000

progress = 0

class MyClient(protocol.Protocol):

    def connectionMade(self):
        self.transport.write("Ready?")

    def dataReceived(self, data):
        global progress
        progress += 1
        print(progress)
        self.transport.write(str(progress))
        if progress == 10:
            self.transport.loseConnection()

    def connectionLost(self, reason):
        print("Completed.")
        reactor.stop()

class MyClientFactory(protocol.ClientFactory):
    protocol = MyClient

factory = MyClientFactory()
reactor.connectTCP(HOST, PORT, factory)

reactor.run()
...