簡體   English   中英

Twisted服務器/客戶端之間的多個呼叫/響應消息

[英]Multiple call/response messages between Twisted server/client

我有一個在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()

我發現我的問題是我過早關閉了連接。 在一些較早的測試中,我試圖在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM