天天看点

python——客户端

客户端

综述

twisted是一个设计非常灵活的框架,通过它可以写出功能强大的客户端,然而要在代码中使用非常多的层次结构。这个文档包括创建用于tcp,ssl和unix sockets的客户端

底层,实际上完成协议语法和处理的是protocol类。这个类通常是来自于twisted.internet.protocol.protocol。大

多数的protocol

handlers继承自这个类或它的子类。protocol类的一个实例将在你连接到服务器时被初始化,在断开连接时结束。这意味着持久的配置不会被保存

在protocol中。

持久的配置将会保存在factory类中,它通常继承自

twisted.internet.protocol.factory(或者

twisted.internet.protocol.clientfactory)。默认的factory类仅仅实例化protocol,并且设置

factory属性指向自己。这使得protocol可以访问、修改和持久配置。

protocol 

这个类将会是代码中使用最多的类,是twisted异步处理数据的一个协议,这意味着这个协议从不等待一个事件,它只是响应从网络中到来的事件。

下面是一个简单的例子:   

这是一个简单的例子,将从连接进来的程序读到的数据显示到标准输出上。下面的例子中protocol会相应另外一个事件:

这个协议连接到服务器,发送一条消息,然后关闭连接。

这个connectionmade通常在protocol对象出现时创建,connectionlost在protocol断开时创建。

简单的,单用户客户端

大多数情况,protocol仅需要连接服务器一次,并且代码只是想获得一个protocol的连接实例。正是由于这些原因,twisted.internet.endpoints提供了一些合适的api,特别是其中的connectprotocol提供了一个protocol实例而不是factory。

clientfactory

要连接这个echoclientfactory到一个服务器上,可以使用下面的代码:

注意:函数connectconnectionfailed在连接不

能established别调用,而clientconnectionlost在连接完成并且断开时被调用。

reactor client apis

connecttcp

ireactortcp.connecttcp 提供对ipv4和ipv6客户端的支持,它接收的host参数可以是主机名,也可以是ip地址,在连接之前reactor会自动的将主机名解析为ip地址。这也意味着如果一个主机名有多个ip地址解析时,重新连接时不一定总是能连接到相同的主机。这说明在每次连接之前都会进行域名解析。如果创建了很多短连接(每秒几百次或几千次),它会首先将主机名解析为ip地址,然后将地址传给connecttcp。

reconnection

通常,当一个客户端连接因为网络问题中断的时候,在断开之后一个重新连接的方法叫做connector.connect()

当连接出错,同时factory收到一个clientconnectionlost的事件通知时,factory通过调用connector.connect()来重新启动一个连接。然而,大多数程序想要实现重连这个功能应该实现reconnectingclientfactory,下面是一个通过reconnectingclientfactory实现的echo protocol:

高级例子:irclogbot

上面客户端的例子都很简单,下面是一个更加复杂的例子

irclogbot.py

irclogbot.py 连接到一个irc服务器,连接一个通道,所有的日志和通信通过它传送到一个文件。

persistent data in the factory

由于protocol实例在每次连接建立的时候都会重新创建,客户端需要对一些需要持久连接的数据进行追踪。

当protocol创建时,会得到一个factory的引用self.factory,它能访问factory的属性。在logbot的例子中,它打开文件并连接到存储在factory中的通道。