Python3 网络编程8:Twisted:高级网络编程框架
                           
天天向上
发布: 2025-03-16 12:20:13

原创
609 人浏览过

Twisted 是一个非常强大的异步网络编程框架,支持多种协议(如 HTTP、FTP、SMTP、Telnet、DNS 等)。它提供了高度灵活的 API,非常适用于构建复杂的网络应用。


8.1 Twisted 基础

Twisted 使用事件驱动的编程模型,可以处理大量的并发连接,而无需创建多线程或多进程。

8.1.1 安装 Twisted

pip install twisted

8.1.2 简单的 TCP 服务器和客户端

8.1.2.1 TCP 服务器

from twisted.internet import protocol, reactor

class EchoServer(protocol.Protocol):
    def dataReceived(self, data):
        print(f"收到数据: {data.decode()}")
        self.transport.write(b"Hello from Twisted Server")

class EchoServerFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return EchoServer()

reactor.listenTCP(1234, EchoServerFactory())
print("Twisted 服务器运行在端口 1234...")
reactor.run()

8.1.2.2 TCP 客户端

from twisted.internet import defer, protocol, reactor

class EchoClient(protocol.Protocol):
    def connectionMade(self):
        self.transport.write(b"Hello Twisted Server")

    def dataReceived(self, data):
        print(f"收到服务器响应: {data.decode()}")
        self.transport.loseConnection()

class EchoClientFactory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        return EchoClient()

    def clientConnectionFailed(self, connector, reason):
        print("连接失败")
        reactor.stop()

reactor.connectTCP("127.0.0.1", 1234, EchoClientFactory())
reactor.run()

8.2 Twisted 与 WebSocket

Twisted 还支持 WebSocket 协议,可以用于构建复杂的 WebSocket 服务器。

8.2.1 WebSocket 服务器

from twisted.internet import reactor
from twisted.protocols import basic
from twisted.web import server
from twisted.web.resource import Resource
from twisted.protocols.web import WebSocketHandler

class WebSocketEchoHandler(WebSocketHandler):
    def connectionMade(self):
        print("WebSocket 连接已建立")

    def dataReceived(self, data):
        print(f"收到数据: {data}")
        self.sendMessage(f"服务器回传: {data}")

    def connectionLost(self, reason):
        print("WebSocket 连接已断开")

class WebSocketResource(Resource):
    def render(self, request):
        return "WebSocket 服务"

site = server.Site(WebSocketResource())
reactor.listenTCP(8765, site)
print("Twisted WebSocket 服务器运行在端口 8765...")
reactor.run()

8.2.2 WebSocket 客户端

import asyncio
from autobahn.asyncio.websocket import WebSocketClientProtocol, WebSocketClientFactory
from autobahn.asyncio.websocket import connect

class MyClientProtocol(WebSocketClientProtocol):
    def onOpen(self):
        self.sendMessage(b"Hello WebSocket Server!")

    def onMessage(self, payload, isBinary):
        print(f"收到消息: {payload.decode()}")
        self.sendClose()

    def onClose(self, wasClean, code, reason):
        print("WebSocket 连接已关闭")

class MyClientFactory(WebSocketClientFactory):
    protocol = MyClientProtocol

uri = "ws://127.0.0.1:8765"
factory = MyClientFactory(uri)

loop = asyncio.get_event_loop()
loop.run_until_complete(connect(factory))

提示Twisted 是一个非常强大的框架,适用于构建 高性能、高并发 的网络服务,特别是当需要支持多个协议时。


8.3 Twisted 与 HTTP 服务

Twisted 也非常适合构建 HTTP 服务器,可以处理复杂的 HTTP 请求和响应。

8.3.1 HTTP 服务器

from twisted.web import server, resource
from twisted.internet import reactor

class SimpleResource(resource.Resource):
    isLeaf = True

    def render_GET(self, request):
        return b"Hello from Twisted HTTP Server!"

site = server.Site(SimpleResource())
reactor.listenTCP(8080, site)
print("Twisted HTTP 服务器运行在端口 8080...")
reactor.run()

8.4 异步任务与 Deferred

Twisted 中的 Deferred 对象用于表示一个尚未完成的操作,它是事件驱动编程的核心。可以通过 addCallbackaddErrback 方法处理结果或错误。

8.4.1 使用 Deferred

from twisted.internet import defer, reactor

def success(result):
    print(f"操作成功: {result}")

def failure(failure):
    print(f"操作失败: {failure}")

def async_task():
    d = defer.Deferred()
    reactor.callLater(2, d.callback, "任务完成")  # 模拟任务完成
    return d

d = async_task()
d.addCallback(success)
d.addErrback(failure)

reactor.run()

下篇文章我们将介绍如何使用 asyncioTwisted 来创建高效的异步 HTTP API!

发表回复 0

Your email address will not be published. Required fields are marked *