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是在连接关闭的时候被调用,两个是有区别的。
新闻热点
疑难解答