Python——Twisted框架,网络通信

一、简介

  twisted是一个封装好的网络通信的库,可以帮助我们快速进行网络编程。注意,python3中,字符串必须转码成utf8的格式,否则无法发送。比如str("test").encode("utf8")即可

二、服务端

服务器需要进行如下操作:

1、在某个端口上一直监听客户端的请求

2、接收到客户端请求后,向客户端发出相应的回应

主要分为下面几个步骤:

1、继承protocol.Protocol建立有关的协议,并实现有关的回调函数

2、继承protocol.Factory建立通信工厂,并在buildProtocol函数中实例化1中的协议

3、reactor.listenTCP(8000, QuoteFactory()) 在某个端口运行通信工厂

# -*- coding utf-8 -*-
from twisted.internet.protocol import Factory, connectionDone
from twisted.internet import reactor, protocol
class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory
    def connectionMade(self):  # 建立连接后的回调函数
        self.factory.numConnections += 1
    def dataReceived(self, data):  # 接收到数据后的回调函数
        print("Number of active connections: %d"
              % self.factory.numConnections)
        print("Received:%s\n Sending: %s" % (data, self.getQuote()))
        self.transport.write(self.getQuote())
        self.updateQuote(data)
    def connectionLost(self, reason=connectionDone):  # 断开连接后的反应
        self.factory.numConnections -= 1
    def getQuote(self):
        return self.factory.quote
    def updateQuote(self, quote):
        self.factory.quote = quote
class QuoteFactory(Factory):
    numConnections = 0
    def __init__(self, quote=None):  # 数据接收后放在在quote中
        self.quote = quote or str("Test").encode("utf8")
    def buildProtocol(self, addr):
        return QuoteProtocol(self)
reactor.listenTCP(8000, QuoteFactory())
reactor.run()
# service_identity

三、客户端

客户端的作用如下:

1、确定服务器的IP和对应的端口号。

2、向服务器发送有关的数据包

主要分为以下几个步骤:

1、继承protocol.Protocol建立有关的协议,并实现有关的回调函数

2、继承protocol.ClientFactory类,建立客户端通信工厂

3、在通信工厂中实现buildProtocol的协议,并实现链接失败的处理函数

# -*- coding utf-8 -*-
from twisted.internet import reactor, protocol
class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory
    def connectionMade(self):
        self.sendQuote()
    def sendQuote(self):
        self.transport.write(self.factory.quote)
    def dataReceived(self, data):
        print("Received quote", data)
        self.transport.loseConnection()
class QuoteClientFactory(protocol.ClientFactory):
    def __init__(self, quote):  # quote是需要发送的数据
        self.quote = quote
    def buildProtocol(self, addr):
        return QuoteProtocol(self)
    def clientConnectionFailed(self, connector, reason):
        print("connection failed", reason.getErrorMessage())
        maybeStopReactor()
    def clientConnectionLost(self, connector, reason):
        print("connection lost", reason.getErrorMessage())
        maybeStopReactor()
def maybeStopReactor():
    global quote_counter
    quote_counter -= 1
    if not quote_counter:
        reactor.stop()
quotes = [
    str("You snooze you lose").encode(),
    str("The early brid gets worm").encode(),
    str("Carpe diem").encode()]
quote_counter = len(quotes)
for quote in quotes:
    reactor.connectTCP('localhost', 8000, QuoteClientFactory(quote))
reactor.run()