Twisted服务器/客户端之间的多个呼叫/响应消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Twisted服务器/客户端之间的多个呼叫/响应消息相关的知识,希望对你有一定的参考价值。

我有一个基本的服务器和客户端在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()

以上是关于Twisted服务器/客户端之间的多个呼叫/响应消息的主要内容,如果未能解决你的问题,请参考以下文章

编写Twisted Client以向多个API调用发送循环GET请求并记录响应

扭曲的多个协议

Pymodbus/Twisted 异步客户端重新连接

Twisted IRCClient - 使用原始数据而不破坏类方法?

iPhone应用程序编程中网络呼叫请求/响应的最佳实践[关闭]

Spring Boot Webclient - 等待多呼叫的结束响应