搭建高性能TCP服务器的向导工具

对于许多开发者来说,即使掌握了互联网通信的许多概念,搭建服务器仍然是一项困难且痛苦的任务。因此,开发了一个名为"Server Wizard"的项目。通常使用向导来启动软件项目,这个工具将指导完成许多细节,并创建所有需要的文件,以便像使用MFC项目向导一样,得到一个完整的C++项目框架,并进行测试。

获得的服务器项目已经准备好编译,可以选择安装为服务,并且可以使用为此目的构建的演示客户端应用程序进行运行和测试。

这项工作依赖于两个库:

  • Push Framework:一个简化高性能TCP服务器创建的库
  • Google Protobuf:一个快速且生成的数据流较小的数据序列化库

向导将收集它们的路径,并生成一个链接到它们的项目,生成所有符合选择的选项的代码。

安装和依赖

首先,应该将这个向导安装到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子目录的根目录。

向导操作

让进入第二页,"常规"。

  • 服务器类名:为PushFramework::Server子类选择一个类名。这个对象的实例将封装许多功能。
  • 服务器描述:在这里添加描述性文本。

继续到"连接"页面:

  • 监听端口:客户端需要连接到这个端口号。
  • 客户端类名:这将用作PushFramework::LogicalConnection子类的名称。这代表了可以放置与登录客户端相关数据的结构。
  • 客户端工厂类名:用于PushFramework::ClientFactory子类的名称,将覆盖许多成员以提供特定行为。
  • 最大同时客户端数。
  • 最大登录持续时间:当连接被接受时,它仍然是一个物理连接,直到收到第一条消息,决定接受该连接作为一个合法客户端,即逻辑连接。
  • 最大不活动时间。如果逻辑连接在超过这个时间段内没有收到任何数据,连接将被强制关闭。
  • 在接收数据之前挑战连接。这将给一个机会,在开始接收任何传入请求之前,强制向新接受的连接发送一条消息。这用于允许复杂的认证机制。
  • 覆盖所有ClientFactory的虚拟方法:向导将覆盖诸如onClientConnected、onClientDisconnected等方法,以便可以放置特定处理。

协议页面无需编辑。一开始,考虑不强制使用特定协议,然后也有提供多种协议实现的想法。最后,为了使事情具体且可测试,选择了Protobuf,可以检查生成的文件,看看协议如何处理protobuf::Message对象,序列化它们,然后添加一些带有前缀的头部,并将流放入目标缓冲区。

如果服务器需要实时广播数据,那么会发现"广播"页面很有用。请参考http://www.pushframework.com上的大量材料了解这个特性。

  • 线程数。这是要生成的线程数,用于将广播消息流式传输到其订阅者(逻辑连接)。
  • 广播队列名称:输入要创建的示例队列的名称。
  • 大小:队列的最大大小。一个消息大小+1被推入队列将导致消息1被移除。
  • 优先级和配额:这些是服务质量(QoS)属性,在这个具体示例中有更好的解释:http://www.pushframework.com/?page_id=435
  • 强制显式注册。如果选中,这意味着服务器中的每个逻辑连接将自动订阅队列的内容。
  • 忽略以前的信息和节流属性。请在Push Framework支持材料中查找详细信息。

根据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类分离到它的单独文件中。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485