Python3 网络编程8:Twisted:高级网络编程框架
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 对象用于表示一个尚未完成的操作,它是事件驱动编程的核心。可以通过 addCallback 和 addErrback 方法处理结果或错误。
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()
下篇文章我们将介绍如何使用 asyncio 和 Twisted 来创建高效的异步 HTTP API!