1. 使用Twisted建立你的服务器(1)
Twisted不只是在性能和环境的多样适应性上精益求精,它最重要的一个突破在于使用组件化的方式开发网络应用程序。可以让大家审视自己最为关注的重点,而忽略一些辅助性的事务。当几名开发人员将自己的成果完成时,汇聚到一起就能成为一个强大的系统。当然,需要技巧来进行这之中的协调,协调的基础是我们自己必须了解这样的过程和它们之间的接口关联。
最为简单的情况下,除了了解清reactor的简单使用,你还要了解Protocol和Factory。它们最终都会由reactor的侦听建立和run来统一调度起来。
建立服务器的第一个要解决的问题就是服务与外界的交流协议。协议的定义在twisted中是通过继承twisted.internet.protocol.Protocol类来实现的。在协议中你可以定义连接、数据接收、断开连接等一系列的事件如果进行响应。但是对于所有连接上来的协议的建立、持久配置数据的存储这样的内容并不会保存在协议中。
持久配置数据的存储通常都会保存在工厂里。
工厂的定义在twisted中是通过继承twisted.internet.protocol.Factory类来实现的。twisted提供了缺省的工厂实现最为普通的需求。它会实例化每个协议,并且通过设置每个协议中factory属性来使协议可以使用到它自己,做这个设置的作用就是让协议在进行处理连接数据时可以使用到工厂中存储的持久配置数据。工厂的启动是需要reactor真实的建立侦听并启动才可以实现的。
reactor侦听的建立可以参考 twisted.internet.interfaces.IReactorTCP.listenTCP。这时我们先只说建立TCP服务器的侦听,如果你需要其它种类的侦听建立参考IReactor*.listen*系列API。
总结一下,我们书写一个twisted的Daemon,实质上会关注三个层次的对象。它们互相可配置,可独立开发,只需要通过简单的调用配置就可结合使用。第一层次就是侦听的建立、工厂的初始化、服务器的运行,它需要reactor的开发。第二个层次就是服务的初始化、用户连接的建立、持久配置数据的存储、协议的实例化,它需要factory的开发。第三个层次就是用户连接建立后的事件处理,这就需要protocol的开发了。
1. 使用Twisted建立你的服务器(2)
请求和实例化的顺序是reactor、factory、protocol。但是真实的开发顺序返回是倒过来的,因为你可能最初始得到的需求是要用什么协议,在设计协义时才能了解需要哪些持久数据和在所有的用户请求是需要共享的内容,以及初始化时所需要完成的事务,最终你才能依据你要应用的平台来考虑优化的方法。我们先来看看如何完成一个自己的协议开发以适用于twisted框架。
理解protocol的工作
twisted的protocol是通过异步处理方式来处理数据的。这就意味着protocol会通过事件来进行网络数据的处理,并且在处理中不会进行任何等待。这是一个最简单的Echo协议的代码:
from twisted.internet.protocol import Protocol
class Echo(Protocol):
def dataReceived(self,data):
self.transport.write(data)
echo是一个非常简单的协议,它所做的事就是将客户机发过来的数据完整的反回给客户端。这里它没有响应所有的方法,但是也是一个可以使用并且运行的协议。下面的代码响应了另一个事件:
from twisted.internet.protocol import Protocol
class HelloHD(Protocol):
def connectionMade(self):
self.transport.write("Hello This is HD's Test protocol\r\n")
self.transport.loseConnection()
这样在用户连接建立时向用户发送一个欢迎消息,然后就断开了与客户机的连接。下面再看一个实现更多事件的协议实现:
from twisted.internet.protocol import Protocol
class Echo(Protocol):
def connectionMade(self):
self.factory.numProtocols = self.factory.numProtocols+1
if self.factory.numProtocols > 100:
self.transport.write("Too many connections,try later")
self.transport.loseConnection()
def connectionLost(self,reason):
self.factory.numProtocols = self.factory.numProtocols-1
def dataReceived(self, data):
self.transport.write(data)
这里不但向应了三个事件:连接初始化、断开连接、接收到数据。而且还使用了factory来存储一个持久的数据(当前并发的用户连接数)。
使用protocol做完一个rptocol的开发如何让它放入一个可以测试的环境中试验呢?以下是一个最为简单的办法进行测试:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
class QOTD(Protocol):
def connectionMade(self):
self.transport.write("An apple a day keeps the doctor away\r\n")
self.transport.loseConnection()
factory = Factory()
factory.protocol = QOTD
reactor.listenTCP(8080, factory)
reactor.run()
最后的六行代码就可以将你的protocol运行起来,成为一个可测试的daemon运行起来。测试的客户端可以使用你的telnet,用telnet登录到你的服务器的8080端口就可以进行最初级的测试了。这几行代码只需要看看Twisted的文档就能明白它的含义了。之前的reactor的说明中也非常细的说了你可以有的选择和运行方法。
分享到:
相关推荐
本文实例讲述了Python基于twisted实现简单的web服务器,分享给大家供大家参考。具体方法如下: 1. 新建htm文件夹,在这个文件夹中放入显示的网页文件 2. 在htm文件夹的同级目录下,建立web.py,web.py的内容为: from ...
4. **HTTP服务器**:由于Twisted支持Web服务器功能,压缩包中可能有一个简单的HTTP服务器示例,使用`twisted.web`模块来处理HTTP请求。 5. **延迟调用与定时器**:Twisted提供了延迟调用(Deferred)机制,用于处理...
3. **Endpoints**: 端点接口提供了一种抽象层,使得启动和停止服务器或者连接到服务器变得更加简单,它可以处理各种底层细节,如端口绑定、连接建立等。 4. **Internet 和 Web**: `Twisted` 支持多种网络服务,包括...
此外,Twisted包含了大量预建的功能模块,如电子邮件、Web服务器、新闻服务器、聊天服务器、DNS解析、SSH安全连接、Telnet终端、远程过程调用(RPC)以及数据库访问等。这些模块使得开发者能够快速构建出复杂的应用...
- **TCP 连接:** 第二章介绍了如何使用 Twisted 建立 TCP 连接,包括服务器端和客户端的实现。 - **Web 客户端与服务器:** 第三章和第四章分别讲解了 Web 客户端和服务端的实现,其中第四章还涉及了基本的身份验证...
- **服务端开发**:Twisted同样适用于服务器端开发,能够构建高效的服务端应用程序,例如Web服务器、聊天服务器等。 - **扩展性**:Twisted支持多种协议和服务的开发,如SMTP、IMAP、Telnet等,具有良好的扩展性和...
Twisted提供了包括TCP、UDP、SSL/TLS、HTTP、FTP等在内的多种网络协议支持,以及对Web服务、邮件系统、IRC聊天服务器等复杂网络应用的构建框架。 Twisted的核心组件之一是`reactor`,它是事件循环的心脏,负责调度...
这一部分应当包含了基于Twisted框架来处理电子邮件相关的网络交互的指南,例如如何建立SMTP客户端或POP服务器等。 “Twisted Names”章节则涉及DNS协议,这部分应当提供了使用Twisted进行DNS相关操作的开发者指南和...
例如,你可以使用`twisted.internet.protocol`模块创建自定义的网络协议,或者使用`twisted.web`构建Web服务器。此外,Twisted还提供了`twisted.internet.reactor`,它是整个框架的心脏,负责调度和处理事件。 接...
这一部分介绍了如何设置一个名为 Twisted Quotes 的示例项目,该项目展示了如何使用 Twisted 构建一个简单的 Web 服务。 ###### 2.3.1 目标 目标是创建一个可以从 Web 页面获取名言的应用程序。 ###### 2.3.2 设置...
- Twisted 的客户端编程与服务器编程类似,但涉及的是如何建立到远程服务器的连接。 - **2.2.2 协议** - 客户端也需要定义协议类来处理与服务器的交互。 - **2.2.3 简单的单次使用客户端** - 这部分介绍了一个...
3. **启动服务器**:通过 `twisted.internet.reactor.listenTCP` 或 `listenSSL` 等方法启动服务器,并将其与之前定义的工厂关联起来。 **2.1.2 协议** 协议是 Twisted 中处理数据传输的核心组件。例如,一个简单的...
1. **事件驱动编程**:Twisted基于事件驱动模型,它使用回调函数来处理网络事件,如连接建立、数据接收和发送等。这种方式使得程序可以同时处理多个连接,提高了并发性能。 2. **协议实现**:Twisted提供了许多预定...
- **简单的单用途客户端**:Twisted 提供了简单的方法来创建单用途客户端,例如使用 `reactor.connectTCP` 连接到远程服务器。 - **高级示例**:更复杂的客户端可能需要使用 `ClientFactory` 类来管理连接状态,以及...
4. Web服务器:使用Twisted的HTTP协议来创建Web服务器,处理HTTP请求和响应。 五、学习与实践 通过研究这些示例代码,你可以了解Twisted如何处理网络连接的建立、数据交换以及错误处理。在实际项目中,你可以根据...
在Web开发中,JavaScript Sockets(WebSocket)常用于实现实时双向通信,这可能意味着这个程序是建立了一个服务器端用Twisted处理的WebSocket服务,客户端则使用JavaScript进行连接和通信。 下面是对Twisted框架和...
WebSocket是一种在客户端和服务器之间建立长连接的协议,提供了全双工通信的能力,允许数据在两个方向上同时传输。相比于传统的HTTP协议,WebSocket更适合实时应用,如在线游戏、股票交易、聊天室等,因为它减少了...
它是 Twisted 和 asyncio 库的扩展,支持异步编程模型,为开发实时、分布式和交互式Web应用程序提供了便利。在Python生态系统中,`autobahn` 被广泛用于构建实时通信应用,如聊天服务、协作工具、物联网(IoT)解决...