对于许多开发者来说,即使掌握了互联网通信的许多概念,搭建服务器仍然是一项困难且痛苦的任务。因此,开发了一个名为"Server Wizard"的项目。通常使用向导来启动软件项目,这个工具将指导完成许多细节,并创建所有需要的文件,以便像使用MFC项目向导一样,得到一个完整的C++项目框架,并进行测试。
获得的服务器项目已经准备好编译,可以选择安装为服务,并且可以使用为此目的构建的演示客户端应用程序进行运行和测试。
这项工作依赖于两个库:
向导将收集它们的路径,并生成一个链接到它们的项目,生成所有符合选择的选项的代码。
首先,应该将这个向导安装到Visual Studio实例中。让为Visual Studio 2008这样做:
获取ServerWizard.zip,将其解压缩到"Server Wizard"文件夹中。或者从这个SVN链接获取最新版本。
将"Server Wizard"目录复制并粘贴到[VSInstallDir]\VC\VCWizards,其中VSInstallDir是Visual Studio 2008的安装目录(例如在机器上是"C:\Program Files (x86)\Microsoft Visual Studio 9.0")。同时,将Server Wizard.ico和Server Wizard.vsz复制到[VSInstallDir]\VC\vcprojects。可以在"Server Wizard"目录中找到这两个文件。
关闭VS2008并重新打开它。现在应该在"创建项目"对话框中看到一个名为"Server Wizard"的新C++向导。
点击创建一个新项目。称之为Project1。
在第一页"概述"中,向导已经要求提供Push Framework和Google Protobuf的路径。
Push Framework可以从这个位置获得:http://www.pushframework.com。应该指向向导代码根目录,可以在其中找到子目录:include、private和项目文件PushFramework.vcproj。
同时,应该构建这个库。它将在源代码根目录之外的名为output的目录中输出其.lib和.dll模块。但是请将其更改为Debug/Release目录,就像任何新创建的项目一样。
关于Google Protobuf,可以从这个网站获得:http://code.google.com/p/protobuf/。下载并构建。现在,指向向导可以看到makefiles和vsprojects子目录的根目录。
让进入第二页,"常规"。
继续到"连接"页面:
协议页面无需编辑。一开始,考虑不强制使用特定协议,然后也有提供多种协议实现的想法。最后,为了使事情具体且可测试,选择了Protobuf,可以检查生成的文件,看看协议如何处理protobuf::Message对象,序列化它们,然后添加一些带有前缀的头部,并将流放入目标缓冲区。
如果服务器需要实时广播数据,那么会发现"广播"页面很有用。请参考http://www.pushframework.com上的大量材料了解这个特性。
根据Push Framework,需要创建许多Service子类来处理客户端请求。每个Service将处理一类请求并提供自定义处理。检查所有3个选项,将生成处理不同类型通信工作流的代码:
如果想要远程监控服务器的活动,那么"远程监控"选项是必不可少的。请参阅Push Framework网站的Analytics部分:http://www.pushframework.com/?page_id=919。
最后,如果想将服务器部署为Windows服务,以便在系统启动时自动启动,那么这可以为自动完成:
生成项目后。应该能够成功编译并运行服务器。Push Framework是一个动态库,所以PushFramework.dll必须部署在可执行文件旁边。
如果选择了"注册为Windows服务"选项,那么要交互式启动服务器,需要添加'm'命令行。原因是,默认情况下,服务器会认为它是由服务管理器(SCM)启动的,所以它会与其通信其入口点并等待它,而不是进行实际处理。
要安装服务器,请使用'i'命令行执行应用程序。
当服务器启动时,它应该开始监听新连接。获取DemoClient.zip包,并使用其中的应用程序连接并测试服务器。
在查看生成的代码并进行测试后,期望开始添加自定义功能。以下是一些指南。
首先,尝试预见服务器和客户端之间所有可能的交换。将这些交换具体化为消息的形式。在提供的proto文件中描述这些消息。这是Google为结构化数据表示创建的语言。启动BATCH文件以将它们编译成C++类。现在,有C++类代表来自客户端的请求或要发送的响应。Protobuf编译器还为所有添加的成员生成getters/setters。
现在,类似于services.h .cpp的内容,添加新的Service子类,并在handle方法中放置自定义代码。不要忘记使用PushFramework::Server::registerService '注册'Service类,将它们与相应的Protobuf消息类型关联起来。所以现在每次收到一个类型为X的请求,它将被发送到一个Service子类Y。因此,组织逻辑,如果想,可以将每个新的Service类分离到它的单独文件中。