开始这个项目时,目标是用Swift编写尽可能简单的Web服务器。不幸的是,我在添加功能时有点过头了,而且这个位置已经由swifter服务器及其Swift语法糖占据了。
所以...虽然Dynamo可以像在这个项目中展示的那样用于iOS应用程序,但焦点已经转向服务器端,在那里可以设置一个简单的框架,在其中可以尝试SSL,代理以及您可能称为“Swift Server Pages”的东西,这些是放置在文档层次结构中的可加载代码包。
Dynamo服务器核心基于“Swiftlets”,即实现DynamoSwiftlet
协议的实例。浏览器将从这些实例接收传入的HTTP请求,并可以选择以任何它选择的方式处理它们。开发人员通过在启动服务器时传入一个swiftlet实例数组合并所需特性和应用程序。
@objc public protocol DynamoSwiftlet {
@objc func process( httpClient: DynamoHTTPConnection ) -> DynamoProcessed
}
@objc public enum DynamoProcessed : Int {
case
NotProcessed, // does not recognise the request
Processed, // has processed the request
ProcessedAndReusable // "" and connection may be reused in HTTP/1.1
}
有关构成Dynamo的类和工具的更多信息,请参阅此处的jazzy文档。框架中包含的Swiftlets如下:
默认swiftlet,用于从~/Sites/host:port或iOS应用程序的资源目录中提供文档。
Dynamo可以作为代理服务器记录从浏览器来的流量,这可能令人惊讶。要使用代理,请运行OSX
目标并将代理设置为localhost:8080。
ApplicationSwiftlet
是所有“应用程序”swiftlets的抽象基类,解析浏览器GET和POST参数和任何Cookies。《SessionSwiftlet》通过Cookies为每个独特的网络用户创建一个分别的Application Swiftlet添加了功能。
BundleSwiftlet
,在OSX应用程序的资源中从扩展名为“.ssp”的包中加载swiftlet。一个简单的Python脚本能从混搭HTML和Swift语言的“.shtml”文件生成包的Swift源代码。《code>ServerPagesSwiftlet将这一过程进一步扩展,当在命令行中使用时,包将从服务器的文档根目录加载。如果包更新了新的功能,并且它包含“AutoLoader.m”占位符,新代码将被“swizzled”到操作中。
《code>ExampleAppSwiftlet用于测试中检查GET和POST表单提交的字符编码。TickTackToe
是一个在包目标中的.ssp应用程序的示例。NumberGuesser
作为一个.shtml模板实现,由Utilities/sspcompiler.py脚本编译成Swift代码。
请参考OSX和iOS目标下的AppDelegate.swift或AppDelegate.m文件了解如何创建这些类实例。
// create shared swiftlet for server applications
let exampleTableGenerator = ExampleAppSwiftlet( pathPrefix: "/example" )
let tickTackToeGame = BundleSwiftlet( pathPrefix: "/ticktacktoe", bundleName: "TickTackToe" )!
let logger = {
(msg: String) in
println( msg )
}
// create non-SSL server/proxy on 8080
DynamoWebServer( portNumber: serverPort, swiftlets: [
LoggingSwiftlet( logger: dynamoTrace ),
exampleTableGenerator,
tickTackToeGame,
SSLProxySwiftlet( logger: logger ),
ProxySwiftlet( logger: logger ),
ServerPagesSwiftlet( documentRoot: documentRoot ),
DocumentSwiftlet( documentRoot: documentRoot )
] )
创建实例就足以让服务器在自己的线程中启动和运行。还有一个额外的“Daemon”目标,创建服务器的命令行版本,应该在DynamoApp.app的资源中运行,这样它就可以找到Dynamo框架。
Dynamo框架有一个.podspec文件,因此可以使用以下命令将其引入到项目中
use_frameworks!
target "<project>" do
pod 'Dynamo', :git => 'https://github.com/johnno1962/Dynamo.git'
end
运行SSL服务器需要一组证书,可以使用从robbiehanson的CocoaHTTPServer(在Utilities/DDKeyChain.[hm]源中的BSD许可证下略微修改的代码)生成的代码来生成。
使用JMeter测试表明,Dynamo能够为以下情况提供服务
在文档目录中的静态文件上每分钟40,000个请求(25个线程)
每分钟40,000个针对NumberGuesser的请求,它会重用连接(见下文)
每分钟18,000个针对TickTckToe的请求,它不会重用连接(见下文)
对于来自同一客户端的大量请求,重用连接很重要。这通过使用单个DynamoHTTPConnection.response( html )方法调用而不是对DynamoHTTPConnection.print( html )方法的单独调用来实现。
一如既往,对仓库的重大提交将通过Twitter@Injection4Xcode宣布。
版权所有 © 2015 John Holdsworth
特此授予任何获得此软件及其相关文档文件(“软件”)副本的人(“许可方”)在软件中无限制地处理的权利,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或销售软件副本,并允许接收软件的人这样做,前提是从以下条件
在软件的副本或大部分副本中应包含上述版权声明和本许可声明。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯专利权。在任何情况下,作者或版权所有者均不对任何主张、损害或其他责任(无论是基于合同、侵权或其他方式)承担责任,这些责任源自、产生于或与此软件或软件的使用或其他操作有关。