python网络编程 twisted框架介绍

5、twisted框架介绍

  • twisted是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。
  • twisted提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/IM、DBM及RDBMS数据库集成、Web/因特网、电子邮件、命令行参数、GUI集成工具包等。
  • twisted不是Python标准库的一部分,所以必须单独下载并安装它
    • pip install twisted

1、创建Twisted Reactor TCP服务器

  • 当一个客户端连接到服务器时就会执行connectionMade()方法,
  • 当服务器接收到客户端通过网络发送的一些数据时就会调用dataReceived()方法。
  • reactor会作为该方法的一个参数在数据中传输,这样就能在无须自己提取它的情况下访问它。
  • 传输实例对象解决了如何与客户端通信的问题。
  • 在服务器代码的最后部分中,创建了一个协议工厂。它之所以被称为工厂,是因为每次得到一个接入连接时,都能“制造”协议的一个实例。
  • 然后在reactor中安装一个TCP监听器,以此检查服务请求。当它接收到一个请求时,就会创建一个TSServProtocol实例来处理
  • 那个客户端的事务。
###python3.8
#!/usr/bin/env python
from twisted.internet import protocol, reactor
from time import ctime
PORT = 21566

class TSServProtocol(protocol.Protocol):
    def connectionMade(self):       #重写connectMade方法
        clnt = self.clnt = self.transport.getPeer().host    #获取主机信息
        print('...connect from', clnt)
    def dataReceive(self, data):    #接收数据
        self.transport.write('[%s] %s' %(ctime(), data.encode()))

factory = protocol.Factory()        #创建了一个协议工厂,每次得到一个接入连接时,都能制造协议的一个实例,然后在reactor中安装一个TCP监听器,以此检查服务请求,
factory.protocol = TSServProtocol
print('waiting for connection...')
reactor.listenTCP(PORT, factory)
reactor.run()

2、创建Twisted Reactor TCP客户端

###python3.8
# !/usr/bin/env python
from twisted.internet import protocol, reactor

HOST = 'localhost'
PORT = 21566

class TSClntProtocol(protocol.Protocol):
    def senData(self):
        data = input('>')
        data = data.encode()
        if data:
            print('...sending %s ....' % str(data,'utf8'))
            self.transport.loseConnection()       #执行losseConnection关闭套接字
    def connectionMade(self):
        self.senData()
    def dataReceived(self, data):
        print(data)
        self.senData()

class TSClntFactory(protocol.ClientFactory):
    protocol = TSClntProtocol
    clientConnectionLost = clientConnectionFailed = lambda self,connector, reason:reactor.stop()

reactor.connectTCP(HOST, PORT, TSClntFactory())    #创建客户端工厂,创建了一个到服务器的连接并运行reactor
reactor.run()
posted @ 2021-06-21 17:08  麦恒  阅读(1178)  评论(0编辑  收藏  举报