zoukankan      html  css  js  c++  java
  • 使用twised实现一个EchoServer

    Protocols
    Protocols描述了如何以异步的方式处理网络中断时间,HTTP、DNS已经IMAP是应用应用层协议中的例子,
    Protocols实现了IProtocol接口,它饱和如下的方法

    makeConnection 在transport对象和服务器之间建立一条连接
    connectionMade 连接建立起来后调用
    dataReceived 接受数据的时候调用
    connectionLost 关闭连接时候调用


    Transports
    代表2个节点之间的通信,负责描述连接是细节,
    Transports实现了ITtansports接口,它包含如下的方法

    write 以非阻塞的方式按顺序依次将数据写到物理连接上,如果遇到阻塞会立刻切换
    writeSequence 将一个字符串列表写到物理连接上,把列表中的每个元素以一个一个写过去
    loseConnection 将所有挂挂起的数据写入,然后关闭连接,即先把未完成的数据传输完成在关闭
    getPeer 取的连接中对端的地址信息
    getHost 取得连接中本端的地址信息



    服务端思路梳理
    总结一下:
    1、调用main方法来启动脚本
    2、一个客户端过来
    3、执行protocol.ServerFactory类中定义的默认的方法
    4、执行factory.protocol类中定义的方法

    客户端思路梳理
    总结
    1、调用main方法来启动脚本
    2、main方法会首先会创建一个客户端的对象,然后通过reactor用这个对象去连接服务端
    3、在来看EehoFactory这个客户端的类做什么工作
    a、首先把一个客户端的类赋值给了protocol,这个就相当于socketer中的handle
    b、clientConnectionFailed,该方法定义如果连接失败该如何处理
    c、clientConnectionLost,该方法定义如果传输过程中失败该如何处理
    4、我们又定义EchoClient类,这个类就是handle,定义客户端和服务端之间是如何工作的
    a、connectionMade,该方法,只有客户端一旦连接上服务端,就会自动调用该方法,我们在该方法中写我们要执行的动作,就比如你连接上一个服务端你会干什么,在这里我们写的发送一个字符串
    b、dataReceived,该方法,只要从服务端接收到数据,就会自动调用该方法,我们在该方法中写当我们收到服务端的数据的时候要执行什么,在这里我们写的是关闭连接
    c、connectionLost,该方法,只要客户端和服务端之间的连接中断,要执行的操作


    终于看到twisted的套路了,可能理解的不够全面

    1、写一个基类,这个基类必须要继承protocl的一个类,这个是twisted框架所要求的,这个基类的作用就是定义一些默认的方法,比如我们在学习socketserver的时候,有setup方法和finish方法
    2、写一个基本的方法,这个方法就是主要有连接过来,就会自动触发的方法,这个方法的作用就类似于socketserver中的handle方法
    3、在写一个reactor的方法,该方法就会时时监听某个端口,看是否有连接进来,如果有连接进来,就会为这个客户端的连接创建一个实例,这个实例就是实例化步骤1中创建的基类

    先看服务端的代码

    from twisted.internet import protocol
    from twisted.internet import reactor
    
    
    class Echo(protocol.Protocol):
        def dataReceived(self, data):
            #只要twisted一收到数据就会调用此方法dataReceived,收到数据后干什么,他就不知道了
            #这里写的意思就是收到后在发回去给客户端
            self.transport.write(data)
    
    def main():
        factory = protocol.ServerFactory()
        #服务器工厂,和客户端建立连接后定义的某些方法,比如发送数据或者文件
        #除了这些,还有一些默认的方法,可以理解为定义一个基础的工厂类,比如
        # soceketserver方法中的setup方法,和finsh方法
    
    
        factory.protocol = Echo
        #相当于socketserver中的handle,必须要写,每个客户端过来都会建立一个
        # 实例,然后就调用Echo这个方法
    
    
        reactor.listenTCP(9000,factory)
        #相当于一个触发器,监听9000端口,把我们定义的基础类放在这里,和socketserver中一样
    
    
        reactor.run()
    
    if __name__ == '__main__':
        main()
    

    在看客户端的代码

    from twisted.internet import reactor
    from twisted.internet import protocol
    
    
    class EchoClient(protocol.Protocol):
        def connectionMade(self):
            #只要链接一建立,就会自动调用此方法
            print "client send data to server"
            self.transport.write("hello world")
    
        def dataReceived(self, data):
            #只要有数据收到,就会调用该方法,这个都是自动的
            print "Server said",data
            self.transport.loseConnection()
            #这里收到数据后,打印数据,然后就关闭链接了,调用这个方法loseConnection,reactor会自动调用connectionLost方法
    
        def connectionLost(self, reason):
            print "Connection lost"
    
    class EehoFactory(protocol.ClientFactory):
        protocol = EchoClient
        #相当于handle
    
        def clientConnectionFailed(self, connector, reason):
            #如果连不上就会调用该方法,也是reactor中自动调用的
            print "Connection failed - goodbye"
            reactor.stop()
    
        def clientConnectionLost(self, connector, reason):
            #如果连的过程中断开了,就会自动执行该方法,也是reactor方法自动调用的
            print "Connection lost - goodbye"
            reactor.stop()
    
    
    def main():
        f = EehoFactory()
        #创建一个客户端的基类
        reactor.connectTCP("localhost",9000,f)
        #直接连接
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    css侧边栏之综合实例3
    css侧边栏之综合实例2
    css实例之侧边栏
    css实例之正文
    css之使用 | margin | padding
    css之链接 | 点击后变色 | 悬停 | hover
    1.2(Mybatis学习笔记)Mybatis核心配置
    1.1(Mybatis学习笔记)初识Mybatis
    1.1(Spring学习笔记)Spring-事务基础
    1.4(Spring学习笔记)Spring-JDBC基础
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/7482763.html
Copyright © 2011-2022 走看看