如何使用Python Twisted将数据从服务器发送到客户端?

4

我刚学习Python,想找一种方法从服务器向客户端发送数据。我有一个在服务器上运行的监控程序,并希望通过Python服务器向Python客户端发送通知。

这是服务器代码:

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import time

class Server(Protocol):

    def connectionMade(self):
        self.transport.write("data to client")

factory = Factory()
factory.protocol = Server
reactor.listenTCP(8789, factory)
reactor.run()

客户端代码
from twisted.internet.protocol import Protocol, ClientFactory
from sys import stdout
from twisted.internet import reactor

class printData(Protocol):
    def dataReceived(self, data):
        stdout.write(data)

class ClientFactory(ClientFactory):
    def startedConnecting(self, connector):
        print 'connecting'

    def buildProtocol(self, addr):
        print 'Connected.'
        return printData()

    def clientConnectionLost(self, connector, reason):
        print reason

    def clientConnectionFailed(self, connector, reason):
        print reason

if __name__ == '__main__':
    reactor.connectTCP('localhost', 8789, ClientFactory())
    reactor.run()

目前我发现如果客户端发送了一条消息,服务器会回复该消息,但是是否有办法在没有等待客户端响应的情况下,仅在客户端可用数据时发送数据到服务器?

2个回答

2
这个服务器不会回复客户端的消息。它在客户端连接时发送一条消息。如果这不是你想要的,那么尝试在不同的事件处理程序中调用transport.write
如果这让你感到困惑,试着思考一下何时你希望服务器向客户端发送数据。
你想每五分钟发送一次数据吗?
你想在服务器的子进程退出时发送数据吗?
你想在管理员在服务器上点击按钮时发送数据吗?
当你确定什么事件应该触发数据被发送后,你只需要将transport.write调用放入处理该事件的方法或函数中即可。

1
哦,好的,谢谢你的解释,让我走上了正确的轨道。 - Gihan Lasita

1
你可以使用Twisted中的AMP协议来完成这个任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接