使用twised实现一个EchoServer

Posted bai_nian_min_guo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用twised实现一个EchoServer相关的知识,希望对你有一定的参考价值。

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

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


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

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

先看服务端的代码

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()

  

以上是关于使用twised实现一个EchoServer的主要内容,如果未能解决你的问题,请参考以下文章

高级爬虫( 二):Scrapy爬虫框架初探

爬虫篇 | 高级爬虫( 二):Scrapy爬虫框架初探

扩展现有协议以使用默认实现实现另一个协议

使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)

使用 vue 实现一个电子签名组件

C语言编写一个函数实现n^k,使用递归实现