【问题标题】:Multiple call/response messages between Twisted server/clientTwisted 服务器/客户端之间的多个调用/响应消息
【发布时间】:2019-07-16 16:51:28
【问题描述】:

我有一个用 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()

【问题讨论】:

    标签: python networking tcp twisted


    【解决方案1】:

    我发现我的问题是我过早地关闭了连接。在一些早期的测试中,我试图在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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2014-02-28
      相关资源
      最近更新 更多