码迷,mamicode.com
首页 > 编程语言 > 详细

python twsited快速基础

时间:2018-11-12 19:46:32      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:告诉   子类   程序   回写   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.
]==>连接丢失!

python twsited快速基础

标签:告诉   子类   程序   回写   reac   point   init   接受   prot   

原文地址:http://blog.51cto.com/13959448/2316013

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!