zoukankan      html  css  js  c++  java
  • 使用Twisted进行socket编程

    你的协议处理类通常是twisted.internet.protocol.Protocol的子类。许多协议处理继承于该类或者比该类更加方便的该类的子类。一个protocol类的实例可能反复连接,也可能在连接关闭之后销毁。这就意味着这些持续不断的配置信息不是保存在Protocol中。
       这些持久性的配置被保存在工厂(Factory)类中,这些工厂类通常继承至twisted.internet.protocol.Factory,默认 的工厂类仅仅是实例化每个Protocol,然后设置他们的factory属性为这个默认的工厂实例本身。这就让每个Protocol都被存储,然后可能 修改,于是这样就形成了Protocol的持久性。
       通常为多个端口或网络地址提供相同的服务是非常有用的。这就是为什么Factory不监听连接,并且实际上它不知道关于网络的任何事情。看 twisted.internet.interfaces.IReactorTCP.listenTCP,另一个IReactor*.listen*获得 更多的信息。

    Twisted使用了更多的基于事件的方式。要写一个基本的服务器,你要实现事件处理 器,它处理诸如一个新的客户端连接、新的数据到达和客户端连接中断等情况。在Twisted中,你的事件处理器定义在一个protocol中;你也需要一 个factory,当一个新的连接到达时它能够构造这个protocol对象,但是如果你仅仅想创建一个自定义的Protocol类的实例的话,你可以使 用来自Twisted的factory,Factory类在模块twisted.internet.protocol中。当你写你的protocol时, 使用twisted.internet.protocol模块中的Protocol作为你的父类。当你得到一个连接时,事件处理器 connectionMade被调用;当你丢失了一个连接时,connectionLost被调用。从客户端接受数据使用处理器 dataReceived。但是你不能使用事件处理策略向客户端发送数据;要向客户端发送数据,你可以使用self.transport,它有一个 write方法。它也有一个client属性,其中包含了客户端的地址(主机名和端口)。

    下面这个例子是一个Twisted版的服务器。 其中实例化了Factory并设置了它的protocol属性以便它知道使用哪个protocol与客户端通信(这就是所谓的你的自定义 protocol)。然后你使用factory开始监听指定的端口,factory通过实例化的protocol对象处理连接。监听使用reactor模 块中的listenTCP函数。最后,你通过调用reactor模块中的run函数来开始服务器。

    from twisted.internet import reactor
    from twisted.internet.protocol import Protocol, Factory

    # 定义你Protocol类
    class SimpleLogger(Protocol):

        def connectionMade(self):
            print 'Got connection from', self.transport.client
        def connectionLost(self, reason):
            print self.transport.client, 'disconnected'
        def dataReceived(self, data):
            print data


    # 实例化Factory

    factory = Factory()

    # 设置factory的protocol属性以便它知道使用哪个protocol与客户端通信(这就是所谓的你的自定义
    # protocol)

    factory.protocol = SimpleLogger

    # 监听指定的端口

    reactor.listenTCP(1234, factory)

    # 开始运行主程序
    reactor.run()


    为 你的处理目的而写一个自定义的protocol是很容易的。模块twisted.protocols.basic中包含了几个有用的已存在的 protocol,其中的LineReceiver执行dataReceived并在接受到了一个完整的行时调用事件处理器lineReceived。如 果当你在接受数据时除了使用lineReceived,还要做些别的,那么你可以使用LineReceiver定义的名为rawDataReceived 事件处理器。下面是一使用LineReceiver的服务器例子:

    from twisted.internet import reactor
    from twisted.internet.protocol import Factory
    from twisted.protocols.basic import LineReceiver

    class SimpleLogger(LineReceiver):

        def connectionMade(self):
            print 'Got connection from', self.transport.client
        def connectionLost(self, reason):
            print self.transport.client, 'disconnected'
        def lineReceived(self, line):
            print line

    factory = Factory()
    factory.protocol = SimpleLogger
    reactor.listenTCP(1234, factory)
    reactor.run()

    参考来自:

    http://acen-chen.javaeye.com/blog/290179

    http://twistedmatrix.com/projects/core/documentation/howto/clients.html

  • 相关阅读:
    失效的Eclipse API(一)
    contiki系统分析四:内存分配
    Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
    Error about updating UI in background thread
    ubuntu 安装ssh server
    [置顶] 树链剖分小节
    [置顶] LCA的树链剖分实现
    飞天开放平台编程指南——阿里云计算的实践
    一道C#面试题
    jQuery参考实例 1.8 将前一次选择的元素集合并到当前选择的元素集中
  • 原文地址:https://www.cnblogs.com/zhepama/p/3536359.html
Copyright © 2011-2022 走看看