65.9K
CodeProject 正在变化。 阅读更多。
Home

服务器向导

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (6投票s)

2013年2月1日

CPOL

7分钟阅读

viewsIcon

32198

downloadIcon

1939

一个 Visual C++ 项目向导,用于快速创建高性能的 C++ TCP 服务器。

引言

对于许多开发人员来说,即使他们精通互联网通信的许多概念,创建一个服务器应用程序也可能很困难且痛苦。

因此,我开发了一个名为“服务器向导”的项目。我们都使用向导来启动我们的软件项目。这个向导将指导您完成许多细节,然后创建所有必要的文件来获得一个可工作的 C++ 项目,就像您使用 MFC 项目向导一样,并获得一个完整的应用程序骨架。

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

最后,这项工作依赖于两个库

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

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

安装和依赖项

您应该做的第一件事是将此向导安装到您的 Visual Studio 实例中。我们以 Visual Studio 2008 为例进行安装。

  1. 下载 ServerWizard.zip,并将其解压到“Server Wizard”文件夹中。
  2. 或者,您可以从这个 SVN 链接 获取最新版本。
  3. 将“Server Wizard”目录剪切并粘贴到:[VSInstallDir]\VC\VCWizards,其中 VSInstallDir 是您的 Visual Studio 2008 的安装目录(在我机器上的示例是“C:\Program Files (x86)\Microsoft Visual Studio 9.0")。此外,将 Server Wizard.icoServer Wizard.vsz 这两个文件复制到 [VSInstallDir]\VC\vcprojects。您可以在“Server Wizard”目录中找到这两个文件。
  4. 关闭 VS2008 并重新打开它。您现在应该在“创建项目”对话框中看到一个名为“Server Wizard”的新 C++ 向导。
  5. 单击以创建一个新项目。我们将其命名为 Project1
  6. 在第一页“概述”中,向导已经要求您提供 Push Framework 和 Google Protobuf 的路径。

Push Framework 可从以下位置获得:http://www.pushframework.com。您应该将向导指向代码根目录,在该目录中可以找到子目录:includeprivate 和项目文件 PushFramework.vcproj

此外,您应该构建此库。它将在名为 output 的目录中输出其 .lib.dll 模块,该目录位于源代码根目录之外。但请将其更改为 Debug/Release 目录,就像任何新创建的项目一样。

关于 Google Protobuf,您可以从以下网址获取:http://code.google.com/p/protobuf/。下载并构建。现在,将向导指向您可以看到 makefilesvsprojects 子目录的根目录。

逐步完成向导

让我们转到第二页“常规”。

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

继续到 连接

  • 监听端口:您的客户端需要在此端口号上连接。
  • 客户端类名:这将用作 PushFramework::LogicalConnection 的子类的名称。它代表您可以放置与已登录客户端相关数据的结构。
  • 客户端工厂类名:用于 PushFramework::ClientFactory 的子类,我们将重写许多成员以提供特定行为。
  • 同时连接的最大数量。
  • 最大登录时长:当接受连接后,它仍然是一个物理连接,直到收到第一个消息,在其中您决定接受该连接为一个合法的客户端,即一个逻辑连接。
  • 最大不活动时长。如果在超过此时间段内未从逻辑连接接收到数据,则连接将被强制关闭。
  • 在接收数据之前挑战连接。这将为您提供机会,在开始接收任何传入请求之前,强制向新接受的连接发送消息。这用于实现复杂的身份验证机制。
  • 重写 ClientFactory 的所有虚拟方法:向导将重写 onClientConnectedonClientDisconnected 等方法,以便您可以添加特定处理。

协议页无需编辑。起初,我考虑不强制使用特定协议,然后又有了提供多种协议实现的想法。最终,为了使内容具体且可测试,选择了 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 中。

© . All rights reserved.