服务器向导






4.83/5 (6投票s)
一个 Visual C++ 项目向导,用于快速创建高性能的 C++ TCP 服务器。
引言
对于许多开发人员来说,即使他们精通互联网通信的许多概念,创建一个服务器应用程序也可能很困难且痛苦。
因此,我开发了一个名为“服务器向导”的项目。我们都使用向导来启动我们的软件项目。这个向导将指导您完成许多细节,然后创建所有必要的文件来获得一个可工作的 C++ 项目,就像您使用 MFC 项目向导一样,并获得一个完整的应用程序骨架。
生成的服务器项目已准备好进行编译,可选择安装为服务,也可以运行并使用为此目的构建的演示客户端应用程序进行测试。
最后,这项工作依赖于两个库
- 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 网站的“分析”部分:http://www.pushframework.com/?page_id=919。
最后,如果您想将服务器部署为 Windows 服务,该服务可以在系统启动时自动启动,那么可以为您自动完成此操作。
编译和测试您的服务器
项目生成后。您应该能够成功编译和运行服务器。Push Framework 是一个动态库,因此 PushFramework.dll 必须部署在可执行文件旁边。
如果您选中了“注册为 Windows 服务”选项,那么要交互式启动服务器,您需要添加 'm
' 命令行。原因是,默认情况下,服务器会认为它是由服务管理器 (SCM) 启动的,因此它会与其入口点进行通信并等待,而不是执行实际处理。
要安装服务器,请使用 'i
' 命令行执行您的应用程序。
当服务器启动时,它应该开始侦听新连接。下载 DemoClient.zip 包并使用其中的应用程序连接并测试服务器。
放置您的自定义代码
在概览了生成的代码并对其进行了测试后,我希望您开始添加自定义功能。这里有一些指南。
- 首先,尝试预见到您的服务器和客户端之间所有可能的交换。将这些交换具体化为消息的形式。在提供的 proto 文件中描述这些消息。这是 Google 为结构化数据表示创建的一种语言。运行 BATCH 文件以将其编译为 C++ 类。现在,您有了代表客户端请求或要发送给客户端的响应的 C++ 类。Protobuf 编译器还会为您添加的每个成员生成 getter/setter。
- 现在,类似于 services.h .cpp 的内容,添加新的
Service
子类,并在 handle 方法中放入自定义代码。不要忘记使用PushFramework::Server::registerService
“注册”您的Service
类,将它们与相应类型的 Protobuf 消息关联起来。这样,每次收到类型为X
的请求时,它都会转到Service
子类Y
。因此,请组织好您的逻辑,如果您愿意,可以将每个新的Service
类分成单独的文件。
更多帮助和指南
如前所述,请尝试从 Push Framework 存储库获取 Push Framework 库和此服务器向导项目的最新源代码。此外,您可能还想跟上 Protobuf 的更新,因为 Google 可能会添加许多重要功能,例如在消息中添加映射和其他集合的功能。
对于错误或增强功能请求,请将其添加到 Issue Tracker 中。