标签:告诉 子类 程序 回写 reac point init 接受 prot
协议处理类通常会子类化twisted.com .internet.protocol. protocol。大多数协议处理程序从这个类继承,或者从它的一个方便子类继承。协议类的实例按连接实例化,按需实例化,并在连接完成时消失。这意味着持久化配置不会保存在协议中。持久化配置保存在工厂类中,工厂类通常继承自twisted.com .internet.protocol.Factory。工厂的buildProtocol方法用于为每个新连接创建Protocol。
能够在多个端口或网络地址上提供相同的服务通常很有用。这就是为什么工厂不监听连接,实际上不知道任何关于网络的信息。
Twisted协议以异步方式处理数据。当事件从网络到达时,协议protocol响应它们,而事件到达将调用协议上的方法。
这是最简单的协议之一。它只是简单地回写所写的内容,而不响应所有事件。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from twisted.internet.protocol import Protocol
class Echo(Protocol):
def dataReceived(self, data):
self.transport.write(data)
下面是一个协议响应另一个事件的例子:
from twisted.internet.protocol import Protocol
class QOTD(Protocol):
def connectionMade(self):
self.transport.write("一天一苹果,不用请医生\r\n")
self.transport.loseConnection()
这个协议用一个名言响应初始连接,然后终止连接。
connectionMade事件通常相应连接对象启动发生,以及任何初始的问候语(如上面的QOTD协议)。connectionLost事件应用于任何特定于连接的对象消失。下面是一个例子:
from twisted.internet.protocol import Protocol
class Echo(Protocol):
def __init__(self, factory):
self.factory = factory
def connectionMade(self):
self.factory.numProtocols = self.factory.numProtocols + 1
self.transport.write("欢迎,这是第%d个运行中的连接\n" % (self.factory.numProtocols,))
def connectionLost(self, reason):
self.factory.numProtocols = self.factory.numProtocols - 1
def dataReceived(self, data):
self.transport.write(data)
工厂用于共享存在于超过任何给定连接的生命周期的状态。
在Echo协议代码中,loseConnection是在写入传输之后立即调用的。只有当Twisted将所有数据写完入操作系统时,loseConnection调用才会关闭连接,因此在这种情况下使用它是安全的,无需担心传输写入丢失。如果生产者与传输一起使用,loseConnection只会在生产者解除注册时关闭连接。在某些情况下,等待所有数据被写出来并不是我们想要的。由于网络故障、bug或另一端连接者的恶意,写入到传输端的数据可能无法交付,因此即使调用loseConnection,连接也不会丢失。在这些情况下,可以使用abortConnection:它立即关闭连接,而不管传输中仍然未写入的缓冲数据或仍然有注册的生产者。
在本例中,我创建了一个协议工厂。我想告诉这个工厂它的任务是构建QOTD协议实例,所以我设置了它的buildProtocol方法来返回QOTD类的实例。然后,我想在一个TCP端口上侦听,因此我创建了一个TCP4ServerEndpoint来标识我想绑定到的端口,然后将我刚刚创建的工厂传递到它的侦听方法。
listen()告诉反应器使用特定的协议来处理到端点地址的连接,但是反应器需要运行才能执行任何操作。run()启动反应器,然后永远等待连接到达指定的端口。您可以通过在终端中按Control-C或调用reactor.stop()来停止反应器。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018
@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
class QOTD(Protocol):#协议类
def connectionMade(self):
self.transport.write("您好!欢迎您的登录,再见!\r\n")
self.transport.loseConnection()
class QOTDFactory(Factory):
def buildProtocol(self, addr):
return QOTD()
endpoint = TCP4ServerEndpoint(reactor, 21200)
endpoint.listen(QOTDFactory())
reactor.run()
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018
@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
class QOTD(Protocol):#协议类
def connectionMade(self):
self.transport.write("您好!欢迎您的登录,再见!\r\n")
self.transport.loseConnection()
class QOTDFactory(Factory):
def buildProtocol(self, addr):
return QOTD()
if __name__=="__main__":
endpoint = TCP4ServerEndpoint(reactor, 21210)
endpoint.listen(QOTDFactory())
reactor.run()
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:28:44 2018
@author: myhaspl
@email:myhaspl@myhaspl.com
client
"""
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor
HOST="localhost"
PORT=21210
class ClientMessage(Protocol):#协议类
def connectionMade(self):
data=raw_input("请输入要发送给服务器的消息")
self.transport.write(data)
def dataReceived(self, data):
print data
self.transport.loseConnection()
class ClientMessageFactory(ClientFactory):#工厂类
def startedConnecting(self, connector):
print ‘开始连接‘
def buildProtocol(self, addr):
print ‘已经连接.‘
return ClientMessage()
def clientConnectionLost(self, connector, reason):
print ‘%s==>连接丢失!‘%reason
def clientConnectionFailed(self, connector, reason):
print ‘%s==>连接错误!‘%reason
if __name__=="__main__":
reactor.connectTCP(HOST, PORT, ClientMessageFactory())
reactor.run()
客户端
开始连接
已经连接.
请输入要发送给服务器的消息hi
您好!欢迎您的登录,再见!
[Failure instance: Traceback (failure with no frames): <class ‘twisted.internet.error.ConnectionDone‘>: Connection was closed cleanly.
]==>连接丢失!
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018
@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
import time
class QOTD(Protocol):#协议类
def connectionMade(self):
print "接受连接"
self.transport.write("您好!欢迎您的登录,再见!\r\n")
def dataReceived(self, data):
if data:
print "客户端发来消息:%s"%data
self.transport.write("[%s]:%s"%(time.ctime(),data))
self.transport.loseConnection()
class QOTDFactory(Factory):
def buildProtocol(self, addr):
return QOTD()
if __name__=="__main__":
endpoint = TCP4ServerEndpoint(reactor, 21210)
endpoint.listen(QOTDFactory())
reactor.run()
接受连接
客户端发来消息:hello,1
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:28:44 2018
@author: myhaspl
@email:myhaspl@myhaspl.com
client
"""
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor
HOST="localhost"
PORT=21210
class ClientMessage(Protocol):#协议类
def connectionMade(self):
data=raw_input("请输入消息:")
self.transport.write(data)
def dataReceived(self, data):
print "服务器回应:%s"%data
class ClientMessageFactory(ClientFactory):#工厂类
def startedConnecting(self, connector):
print ‘开始连接‘
def buildProtocol(self, addr):
print ‘已经连接.‘
return ClientMessage()
def clientConnectionLost(self, connector, reason):
print ‘%s==>连接丢失!‘%reason
def clientConnectionFailed(self, connector, reason):
print ‘%s==>连接错误!‘%reason
if __name__=="__main__":
reactor.connectTCP(HOST, PORT, ClientMessageFactory())
reactor.run()
开始连接
已经连接.
请输入消息:hello,1
服务器回应:您好!欢迎您的登录,再见!
服务器回应:[Sun Sep 16 16:37:08 2018]:hello,1
[Failure instance: Traceback (failure with no frames): <class ‘twisted.internet.error.ConnectionDone‘>: Connection was closed cleanly.
]==>连接丢失!
标签:告诉 子类 程序 回写 reac point init 接受 prot
原文地址:http://blog.51cto.com/13959448/2316013