> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Wrapper 示例

> 使用 Wrapper（wrappingGsdk）示例在 PlayFab Multiplayer Servers 上运行现有的 Windows 或 Linux 游戏服务器，无需在你的二进制文件中添加 GSDK 调用。

Wrapper 示例（又名 wrappingGsdk）会对已有游戏进行包装，使其可用于部署基于 **Windows OS** 和 **Linux OS** 的游戏服务器构建。

借助 wrapper 应用程序，你也能在 PlayFab Multiplayer Servers 上使用自己的游戏服务器构建。

<Info>
  wrapper 通过处理标准输出和错误流以调用 GSDK 方法的方式来实现变通，并不适用于生产环境。
</Info>

## 示例内容

本示例包含两个 .NET Core 控制台应用程序。

* Wrapper——将最新的 PlayFab Game Server SDK (GSDK) NuGet 包与你的游戏服务器集成。此 wrapper 应用程序**不适用于生产环境**
* Fakegame——一个对 GSDK 一无所知的基础游戏服务器。它就像你在使用 PlayFab Multiplayer Servers 之前所拥有的典型游戏服务器。它启动 ASP.NET Core Web Server Kestrel，监听 TCP 端口 80。旨在模拟一个完全不了解 GSDK 的游戏服务器。如果你没有自己的游戏服务器，可以使用它。它提供了两个可用的 GET 路由：/hello 用于获取简单响应，/hello/terminate 用于终止服务器。

## 要求

* [.NET Core 3.1 x64 SDK](https://dotnet.microsoft.com/download)

<Note>
  为了使用和查看 PlayFab Multiplayer Servers，你需要在 Game Manager 中启用该功能。相关说明请参阅 [启用 PlayFab Server 功能](/services/playfab/multiplayer/servers/enable-playfab-multiplayer-servers)。
</Note>

## 演练

如需观看构建本示例的完整演示，请查看我们在 Microsoft Game Dev 2021 上的演讲（从大约 2:52 开始）：

<iframe src="https://www.youtube.com/embed/kj2TcMlvWgk" width="100%" height="400" allowFullScreen frameBorder="0" />

## 获取并构建 Wrapper 可执行文件

* 使用标准 Git 方法或以 zip 文件方式下载 [GSDK wrapper 示例](https://github.com/PlayFab/MpsSamples/tree/master/wrappingGsdk)
* 打开命令提示符，使用 cd 命令切换到 wrapper.csproj 文件所在目录。例如：**cd C:/ReplaceWithYourFilePath/wrappingGsdk/wrapper**
* 然后运行以下 .NET Core CLI 命令：

```
dotnet publish --self-contained -r win-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true
```

当 wrapper 构建成功后，可执行文件会发布到 ..\wrappingGsdk\wrapper\bin\Debug\netcoreapp3.1\win-x64\publish 文件夹中，如下图所示。

<img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/create-your-first-server/wrapper-exe-location.PNG?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=1667c376bbaa6670b270d5264513278c" alt="wrapper 可执行文件的发布位置" width="1615" height="365" data-path="images/playfab/multiplayer/servers/create-your-first-server/wrapper-exe-location.PNG" />

## 创建游戏服务器资产

创建游戏服务器资产有两种方式。

### 将 Fakegame 游戏服务器与 wrapper 一起使用

使用 build.ps1 构建并打包两个项目（wrapper 与 fakegame）。此脚本会创建一个 drop 文件夹，其中包含一个 .zip 文件，里面包含所需文件。

* 打开 PowerShell
* 使用 cd 命令切换到 build.ps1 脚本所在目录。例如：cd C:/ReplaceWithYourFilePath/wrappingGsdk/
* 运行 **\build.ps1**
* 脚本运行成功后，前往 ..\wrappingGsdk\drop\ 文件夹。你会看到已生成一个 **gameassets.zip** 文件，其中包含 fake 游戏服务器构建、之前步骤中构建的 wrapper 可执行文件以及其他所需文件。

### 将你自己的游戏服务器文件与 wrapper 一起使用

若要在评估中使用你自己的游戏项目，请将 wrapper 与你的游戏服务器可执行文件放在同一文件夹中。

* 按照 [构建 wrapper 可执行文件](#acquire-and-build-wrapper-executable) 的说明操作
* 前往 wrapper 发布位置 ..\wrappingGsdk\wrapper\bin\Debug\netcoreapp3.1\win-x64\publish
* 在另一个窗口中，前往你的游戏服务器构建及其运行所需的文件所在位置。如果不确定需要哪些文件，请参阅 [确定所需的 DLL 文件](/services/playfab/multiplayer/servers/determining-required-dlls)
* 将游戏服务器构建及所有所需文件复制到 wrapper 发布位置
* 选中 wrapper 发布位置中的所有文件
* 全选后右键，选择 **发送到** > **压缩(zipped)文件夹**。不要选择 wrapper 发布文件夹再压缩，否则会导致映射错误。

<Tip>
  为进行交叉核对，请按照 [将 Fakegame 游戏服务器与 wrapper 一起使用](#use-fakegame-game-server-with-the-wrapper) 的说明构建 gameassets.zip 并将其作为参考。
</Tip>

## 创建并上传 Linux 容器镜像（仅适用于 Linux 服务器）

要创建 Linux 容器镜像，你需要一个 Dockerfile。Dockerfile 是一个无扩展名的文本文件，包含构建给定容器镜像所需的所有命令。在本示例中，该文件已为你创建好。你只需要构建并运行容器镜像。

如果你希望使用 Windows 开发设备，则需要安装 Windows Subsystem for Linux (WSL)。下面提供了相关说明。更多信息请参阅 [Windows 与 Linux 容器镜像的差异](/services/playfab/multiplayer/servers/deploying-linux-based-builds#windows-and-linux-container-image-differences)。

1. [配置你的 Windows 开发设备](/services/playfab/multiplayer/servers/deploying-linux-based-builds#set-up-your-windows-development-device)（可选）
2. [获取你的 PlayFab 容器注册表登录凭据](/services/playfab/multiplayer/servers/deploying-linux-based-builds#get-your-playfab-container-registry-sign-in-credentials)
3. 使用现有的/创建你自己的 Dockerfile
   此步骤根据你使用 FakeGame 还是自己的游戏服务器而有所不同。
   * 如果你使用 FakeGame，请确认已有 [Dockerfile](https://github.com/PlayFab/MpsSamples/blob/master/wrappingGsdk/Dockerfile)
   * 如果你使用自己的游戏或需要创建 Dockerfile，请参阅 [创建你的 Dockerfile](/services/playfab/multiplayer/servers/deploying-linux-based-builds#create-a-dockerfile)。你可以将 FakeGame 的 [Dockerfile](https://github.com/PlayFab/MpsSamples/blob/master/wrappingGsdk/Dockerfile) 作为起点。
4. 打开安装了 Docker 的 Linux 终端（例如 Ubuntu）。将 TAG 和 ACR 变量的值替换为你自己的值。然后运行以下命令。

```docker theme={null}
TAG="0.1"
ACR="customer5555555.azurecr.io"
docker login ${ACR}
```

<Tip>
  要检查 ACR 和 TAG 变量是否已正确定义，运行 **echo $ACR__ 和 __echo $TAG**。
</Tip>

5. 输入你在上一步中获取的用户名和密码。
6. 构建并上传 Linux 容器镜像。

运行以下命令来构建并上传 Dockerfile。**docker build** 命令末尾有一个 "."。你必须与 Dockerfile 位于同一文件夹/目录。详情请参阅 [构建并上传 Linux 容器镜像](/services/playfab/multiplayer/servers/deploying-linux-based-builds#build-and-upload-linux-container-image)。

```docker theme={null}
docker build -t ${ACR}/wrapper:${TAG} .
docker push ${ACR}/wrapper:${TAG}
```

## 使用 Game Manager 或 API 部署构建

Windows 与 Linux 游戏服务器的部署构建流程类似。

### 部署 Windows 游戏服务器

步骤与 Windows Runner C# 示例类似。按照下列步骤操作，其中的差异如下所示。

* [使用 Game Manager 部署和配置服务器](/services/playfab/multiplayer/servers/quickstart-for-multiplayer-servers-game-manager)
* [使用 PowerShell/API 部署和配置服务器](/services/playfab/multiplayer/servers/quickstart-for-multiplayer-servers-api-powershell)

如果你希望在本地测试，请参阅 [本地调试游戏服务器及与 PlayFab 集成](/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab)。

**本示例特有的设置**

* 启动命令：
  * 使用 **C:\Assets\wrapper.exe -g C:\Assets\fakegame.exe arg1 arg2**
  * 如果你使用自己的游戏服务器构建，请将 fakegame.exe 替换为你的游戏服务器可执行文件名
* 网络配置：Name: **gameport**、Port: **80**、Protocol: **TCP**
* 资产：使用 FakeGame 时，将 **gameassets.zip** 上传为资产。

### 部署 Linux 游戏服务器

按照以下总体步骤进行部署。

* [使用 Game Manager 部署和配置服务器](/services/playfab/multiplayer/servers/deploy-using-game-manager)
* [使用 PowerShell/API 部署和配置服务器](/services/playfab/multiplayer/servers/deploy-using-powershell-api)

**本示例特有的设置**

* 选择你已上传的容器
* 网络配置：Name: **gameport**、Port: **80**、Protocol: **TCP**
* 无需上传资产及设置 **Start Command**

<Note>
  使用 RequestMultiplayerServer API 分配时，你连接到的端口将不同于 80。这是因为 PlayFab Multiplayer Server 服务将在 Azure Load Balancer（将你的端口暴露到公共互联网）与运行在 Azure 虚拟机上的游戏服务器之间创建映射。
</Note>

## 使用 LocalMultiplayerAgent 运行 wrapper

如果你希望在自定义游戏服务器上测试 GSDK 集成，强烈推荐使用 LocalMultiplayerAgent。

如果你在 Windows 容器中使用 LocalMultiplayerAgent，需要正确配置 MultiplayerSettings.json 文件。下面是一个示例，请特别注意 LocalFilePath 和 StartGameCommand 的值。别忘了将 fakegame.exe 替换为你的游戏服务器可执行文件名。

```json theme={null}
"AssetDetails": [
    {
        "MountPath": "C:\\Assets",
        "SasTokens": null,
        "LocalFilePath": "C:\\projects\\gsdkSamples\\wrappingGsdk\\drop\\gameassets.zip"
    }
],
"StartGameCommand": "C:\\Assets\\wrapper.exe -g C:\\Assets\\fakegame.exe",

// if you are using fakegameserver you should also configure port mapping for port 80
"PortMappingsList": [
            [
                {
                    "NodePort": 56100,
                    "GamePort": {
                        "Name": "gameport",
                        "Number": 80,
                        "Protocol": "TCP"
                    }
                }
            ]
        ]
```

现在你已准备好使用 LocalMultiplayerAgent 进行测试。如果配置正确，一旦 LocalMultiplayerAgent 启动了你的游戏服务器，你就可以通过 curl 在 **[http://localhost:56100/Hello](http://localhost:56100/Hello)** 连接到它。

## 如何在 MPS 上连接游戏服务器

要与 MPS 上的游戏服务器建立连接，必须先确定合适的端口号。这一要求源于以下配置：多台虚拟机（每台可能运行多个游戏服务器实例）由一个负载均衡器统一管理。在这样的架构下，一个公共 IP 端口可能对应这些虚拟机上的不同端口，每个端口对应一个不同的游戏服务器实例。

### 使用 Game Manager

你可以使用 Game Manager UI 分配一个游戏服务器并与之建立连接。

1. 登录 Game Manager
2. 前往 Multiplayer => Servers 页面，选择你的构建
3. 前往 Servers 页面，单击 "Request server" 按钮。
4. 在下一页中，记录公共 **IPv4 address** 和 **Port**。
5. 使用 curl 在 **http\://\[IPV4Address]:\[Ports->Num]/Hello** 处连接。"

### 使用 MPS Allocator 示例

以下是使用 [MPS Allocator 示例](/services/playfab/multiplayer/servers/mps-allocator-sample) 分配游戏服务器并与之建立连接的方式。

1. 编译并执行 MPS Allocator 示例。
2. 使用 "ListBuildSummaries" 命令查看可用构建及其对应的构建 ID。
3. 调用 "RequestMultiplayerServer" 请求一个游戏服务器实例。
4. 将选择的构建 ID 输入到 "ListMultiplayerServers" 命令中，以生成可用服务器列表。
5. 选择一个活动的游戏服务器实例，然后使用前面步骤中获得的构建 ID 与会话 ID 调用 "GetMultiplayerServerDetails"。
6. 记录响应中显示的 **IPV4Address** 和 **Ports->Num**。
7. 使用 curl 在 **http\://\[IPV4Address]:\[Ports->Num]/Hello** 处连接。

## 另请参阅

* [创建你的第一个服务器](/services/playfab/multiplayer/servers/create-your-first-server)
* [资源和示例](/services/playfab/multiplayer/servers/server-samples-resources)
* [PlayFab Multiplayer Server SDK](/services/playfab/multiplayer/servers/server-sdks/overview)
* [API 参考](xref:titleid.playfabapi.com.multiplayer.multiplayerserver)


## Related topics

- [创建您的第一个服务器](/zh-CN/services/playfab/multiplayer/servers/create-your-first-server.md)
- [使用 PowerShell/API 部署构建](/zh-CN/services/playfab/multiplayer/servers/deploy-using-powershell-api.md)
- [LocalMultiplayerAgent 概述](/zh-CN/services/playfab/multiplayer/servers/LocalMultiplayerAgent/local-multiplayer-agent-overview.md)
- [使用 LocalMultiplayerAgent 调试容器游戏服务器](/zh-CN/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-container-gameserver.md)
- [使用 LocalMultiplayerAgent 调试基于进程的游戏服务器](/zh-CN/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
