首页 > 编程 > Python > 正文

使用Python的Twisted框架编写简单的网络客户端

2020-02-23 00:45:16
字体:
来源:转载
供稿:网友

Protocol
  和服务器一样,也是通过该类来实现。先看一个简短的例程:

from twisted.internet.protocol import Protocolfrom sys import stdoutclass Echo(Protocol):  def dataReceived(self, data):    stdout.write(data)

在本程序中,只是简单的将获得的数据输出到标准输出中来显示,还有很多其他的事件没有作出任何响应,下面
有一个回应其他事件的例子:

from twisted.internet.protocol import Protocolclass WelcomeMessage(Protocol):  def connectionMade(self):    self.transport.write("Hello server, I am the client!/r/n")    self.transport.loseConnection()

本协议连接到服务器,发送了一个问候消息,然后关闭了连接。
connectionMade事件通常被用在建立连接的事件发生时触发。关闭连接的时候会触发connectionLost事件函数

(Simple, single-use clients)简单的单用户客户端
  在许多情况下,protocol仅仅是需要连接服务器一次,并且代码仅仅是要获得一个protocol连接的实例。在
这样的情况下,twisted.internet.protocol.ClientCreator提供了一个恰当的API

from twisted.internet import reactorfrom twisted.internet.protocol import Protocol, ClientCreatorclass Greeter(Protocol):  def sendMessage(self, msg):    self.transport.write("MESSAGE %s/n" % msg)def gotProtocol(p):  p.sendMessage("Hello")  reactor.callLater(1, p.sendMessage, "This is sent in a second")  reactor.callLater(2, p.transport.loseConnection)c = ClientCreator(reactor, Greeter)c.connectTCP("localhost", 1234).addCallback(gotProtocol)


ClientFactory(客户工厂)
  ClientFactory负责创建Protocol,并且返回相关事件的连接状态。这样就允许它去做像连接发生错误然后
重新连接的事情。这里有一个ClientFactory的简单例子使用Echo协议并且打印当前的连接状态

from twisted.internet.protocol import Protocol, ClientFactoryfrom sys import stdoutclass Echo(Protocol):  def dataReceived(self, data):    stdout.write(data)class EchoClientFactory(ClientFactory):  def startedConnecting(self, connector):    print 'Started to connect.'    def buildProtocol(self, addr):    print 'Connected.'    return Echo()    def clientConnectionLost(self, connector, reason):    print 'Lost connection. Reason:', reason    def clientConnectionFailed(self, connector, reason):    print 'Connection failed. Reason:', reason

要想将EchoClientFactory连接到服务器,可以使用下面代码:

from twisted.internet import reactorreactor.connectTCP(host, port, EchoClientFactory())reactor.run()

注意:clientConnectionFailed是在Connection不能被建立的时候调用,clientConnectionLost是在连接关闭的时候被调用,两个是有区别的。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表