Python使用twisted包进行网络通信

简介

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

服务器server端

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

  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()
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值