

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon GameLift Servers Local 测试您的集成。
<a name="integration-testing-local"></a>

**注意**  
本主题介绍仅与 Amazon GameLift Servers 服务器 SDK 版本 3.x 和 4.x 的 SDK 集成的游戏测试。您的服务器 SDK 软件包中包含兼容版本的 Amazon GameLift Servers Local。如果您使用的是服务器 SDK 版本 5.x，请参阅[使用 GameLift Server SDK 5.x 进行本地测试](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/integration-testing-local.html)以了解如何通过 Amazon GameLift Servers Anywhere 实例集进行本地测试。有关从 SDK 4.x 迁移到 5.x 的指南，请参阅[迁移到 GameLift Server SDK 5.x](https://docs.aws.amazon.com/gamelift/latest/developerguide/reference-serversdk5-migration.html)。

使用 Amazon GameLift Servers Local 可以在本地设备上运行托管 Amazon GameLift Servers 服务的有限版本，并在其上测试您的游戏集成。此工具在对您的游戏集成进行迭代开发时非常有用。替代方案是将每个新生成包上传到 Amazon GameLift Servers 并配置实例集来托管游戏，每次都需要数分钟或更长时间。

通过 Amazon GameLift Servers Local，您可以验证以下内容：
+ 您的游戏服务器与服务器开发工具包正确集成，并且正确与 Amazon GameLift Servers 服务通信，可启动新游戏会话、接受新玩家和报告运行状况及状态。
+ 您的游戏客户端与适用于 Amazon GameLift Servers 的 AWS SDK 正确集成，可以检索现有游戏会话的信息，启动新游戏会话，让玩家加入游戏并连接到游戏会话。

Amazon GameLift Servers Local 是一个命令行工具，可启动托管 Amazon GameLift Servers 服务的独立版本。Amazon GameLift ServersLocal 还提供了服务器进程初始化、运行状况检查以及 API 调用和响应的运行事件日志。Amazon GameLift ServersLocal 可识别适用于 Amazon GameLift Servers 的 AWS SDK 操作的子集。您可以从 AWS CLI 或者从游戏客户端进行调用。在本地执行的所有 API 操作与在 Amazon GameLift Servers Web 服务上执行时完全一样。

每个服务器进程只能托管一个游戏会话。游戏会话是您用来连接到 Amazon GameLift Servers Local 的可执行文件。游戏会话完成后，您应该调用`GameLiftServerSDK::ProcessEnding`然后退出该进程。使用 Amazon GameLift Servers Local 进行本地测试时，您可以启动多个服务器进程。每个进程都将连接到 Amazon GameLift Servers Local。然后，您可以为每个服务器进程创建一个游戏会话。当您的游戏会话结束时，您的游戏服务器进程应该退出。然后，必须手动启动另一个服务器进程。

Amazon GameLift Servers Local 支持以下 API：
+ CreateGameSession()
+ CreatePlayerSession()
+ CreatePlayerSessions()
+ DescribeGameSessions()
+ DescribePlayerSessions()

## 设置 Amazon GameLift Servers Local
<a name="integration-testing-local-start"></a>

Amazon GameLift Servers Local 作为与`.jar`服务器开发工具包[捆绑的可执行 ](https://aws.amazon.com/gamelift/servers/getting-started/) 文件提供。它可以在 Windows 或 Linux 上运行，并可用于任何 Amazon GameLift Servers 支持的语言。对于 SDK 版本 4.0.2，您可以从[官方 GitHub 发布页面](https://github.com/amazon-gamelift/amazon-gamelift-servers-csharp-server-sdk/releases)下载。GameLiftLocal.jar 文件包含在 GameLift-CSharp-ServerSDK-4.0.2.zip 构件中。

在运行 Local 之前，您还必须已安装以下各项。
+ 适用于 Amazon GameLift Servers 版本 3.1.5 至 4.x 的服务器 SDK 生成包版本。
+ Java 8 

## 测试游戏服务器
<a name="integration-testing-local-server"></a>

如果您只要测试游戏服务器，则可以使用 AWS CLI 来模拟游戏客户端对 Amazon GameLift Servers Local 服务的调用。这将验证您的游戏服务器是否按预期执行以下操作：
+ 游戏服务器正确启动并初始化 Amazon GameLift Servers 服务器 SDK。
+ 在启动过程中，游戏服务器通知 Amazon GameLift Servers，服务器已准备好托管游戏会话。
+ 在运行时，游戏服务器每分钟将运行状况发送到 Amazon GameLift Servers。
+ 游戏服务器响应请求，启动新游戏会话。

1. **启动 Amazon GameLift Servers Local。**

   打开命令提示符窗口，导航到包含 `{{GameLiftLocal.jar}}` 文件的目录并运行它。默认情况下，Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号，请使用 `-p` 参数，如以下示例所示：

   ```
   java -jar GameLiftLocal.jar -p 9080
   ```

   Local 启动之后，您可以查看日志，其中指示两个本地服务器已启动，一个列出您的游戏服务器，另一个列出您的游戏客户端或 AWS CLI。日志继续报告两个本地服务器上的活动，包括往返于游戏组件之间的通信。

1. **启动游戏服务器。**

   在本地启动您的 Amazon GameLift Servers 集成游戏服务器。您无需更改游戏服务器的终端节点。

   在 Local 命令提示符窗口中，日志消息指示您的游戏服务器已连接至 Amazon GameLift Servers Local 服务。这意味着游戏服务器已成功初始化适用于 Amazon GameLift Servers 的服务器 SDK（使用 `InitSDK()`）。它使用所示的日志路径调用 `ProcessReady()`，如果成功，则已准备好托管游戏会话。在游戏服务器运行期间，Amazon GameLift Servers 记录来自各游戏服务器的各个运行状况报告。以下日志消息示例显示了成功集成的游戏服务器：

   ```
   16:50:53,217  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - SDK connected: /127.0.0.1:64247 
   16:50:53,217  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - SDK pid is 17040, sdkVersion is 3.1.5 and sdkLanguage is CSharp
   16:50:53,217  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - NOTE: Only SDK versions 3.1.5 and above are supported in GameLiftLocal!
   16:50:53,451  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onProcessReady received from: /127.0.0.1:64247 and ackRequest requested? true
   16:50:53,543  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onProcessReady data: logPathsToUpload: "C:\\game\\logs"
   logPathsToUpload: "C:\\game\\error"
   port: 1935
           
   16:50:53,544  INFO || - [HostProcessManager] nioEventLoopGroup-3-1 - Registered new process true, true,
   16:50:53,558  INFO || - [SDKListenerImpl] nioEventLoopGroup-3-1 - onReportHealth received from /127.0.0.1:64247 with health status: healthy
   ```

   潜在的错误和警告消息包括以下内容：
   + 错误：“ProcessReady did not find a process with pID: {{<process ID>}}\! 是否已调用 InitSDK()？”
   + 警告：“Process state already exists for process with pID: {{<process ID>}}\! 是否已多次调用 ProcessReady(...)？”

1. **启动 AWS CLI。**

   在您的游戏服务器成功调用 `ProcessReady()` 之后，您可以开始进行客户端调用。打开另一个命令提示符窗口并启动 AWS CLI 工具。默认情况下，AWS CLI 使用 Amazon GameLift Servers Web 服务终端节点。您必须在使用 `--endpoint-url` 参数的每个请求中，使用 Local 终端节点覆盖此项，如以下示例请求中所示。

   ```
   AWS gamelift describe-game-sessions --endpoint-url http://localhost:9080  --fleet-id fleet-123
   ```

   在 AWS CLI 命令提示符窗口中，`AWS gamelift` 命令会生成 [AWS CLI 命令参考](https://docs.aws.amazon.com/cli/latest/reference/gamelift)中所示的响应。

1. **创建游戏会话。**

   使用 AWS CLI 提交 [CreateGameSession()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreateGameSession.html) 请求。该请求应采用预期的语法。对于 Local，`FleetId` 参数可以设置为任意有效字符串 (`^fleet-\S+`)。

   ```
   AWS gamelift create-game-session --endpoint-url http://localhost:9080 --maximum-player-session-count 2 --fleet-id
       fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
   ```

   在 Local 命令提示符窗口中，日志消息指示 Amazon GameLift Servers Local 已向您的游戏服务器发送 `onStartGameSession` 回调。如果成功创建了游戏会话，您的游戏服务器通过调用 `ActivateGameSession` 来响应。

   ```
   13:57:36,129  INFO || - [SDKInvokerImpl]
           Thread-2 - Finished sending event to game server to start a game session:
           arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-ab423a4b-b827-4765-aea2-54b3fa0818b6.
           Waiting for ack response.13:57:36,143  INFO || - [SDKInvokerImpl]
           Thread-2 - Received ack response: true13:57:36,144  INFO || -
           [CreateGameSessionDispatcher] Thread-2 - GameSession with id:
           arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-ab423a4b-b827-4765-aea2-54b3fa0818b6
           created13:57:36,227  INFO || - [SDKListenerImpl]
           nioEventLoopGroup-3-1 - onGameSessionActivate received from: /127.0.0.1:60020 and ackRequest
           requested? true13:57:36,230  INFO || - [SDKListenerImpl]
           nioEventLoopGroup-3-1 - onGameSessionActivate data: gameSessionId:
           "arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890"
   ```

   在 AWS CLI 窗口中，Amazon GameLift Servers 使用包含游戏会话 ID 的游戏会话对象进行响应。请注意，新游戏会话的状态为“Activating”。游戏会话调用 ActivateGameSession 后，状态将更改为“Active”。如果您希望查看更改后的状态，请使用 AWS CLI 调用 `DescribeGameSessions()`。

   ```
   {
       "GameSession": {
         "Status": "ACTIVATING",
         "MaximumPlayerSessionCount": 2,
         "FleetId": "fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
         "GameSessionId": "arn:aws:gamelift:local::gamesession/fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d/gsess-abcdef12-3456-7890-abcd-ef1234567890",
         "IpAddress": "127.0.0.1",
         "Port": 1935
       }
   }
   ```

## 测试游戏服务器和客户端
<a name="integration-testing-local-client"></a>

要检查您的完整游戏集成，包括将玩家连接到游戏，您可以在本地运行游戏服务器和客户端。这使您可以测试从游戏客户端对 Amazon GameLift Servers Local 进行的编程调用。您可以验证以下操作：
+ 游戏客户端成功向 AWS Local 服务发出 Amazon GameLift Servers 开发工具包请求，包括创建游戏会话、检索现有游戏会话上的信息以及创建玩家会话。
+ 游戏服务器在玩家尝试加入游戏会话时，正确验证玩家。对于通过验证的玩家，游戏服务器可能会检索玩家数据 (如果已实施)。
+ 游戏服务器在玩家离开游戏时报告断开连接。
+ 游戏服务器报告结束游戏会话。

1. **启动 Amazon GameLift Servers Local。**

   打开命令提示符窗口，导航到包含 `{{GameLiftLocal.jar}}` 文件的目录并运行它。默认情况下，Local 在端口 8080 上侦听来自游戏客户端的请求。要指定不同的端口号，请使用 `-p` 参数，如以下示例所示。

   ```
   ./gamelift-local -p 9080
   ```

   Local 启动之后，您可以查看日志，其中显示两个本地服务器已启动，一个列出您的游戏服务器，另一个列出您的游戏客户端或 AWS CLI。

1. **启动游戏服务器。**

   在本地启动您的 Amazon GameLift Servers 集成游戏服务器。有关消息日志的详细信息，请参阅[测试游戏服务器](#integration-testing-local-server)。

1. **为 Local 配置您的游戏客户端并启用它。**

   要将您的游戏客户端与 Amazon GameLift Servers Local 服务一起使用，您必须对游戏客户端的设置进行以下更改，如[设置 Amazon GameLift Servers API](gamelift-sdk-client-api.md#gamelift-sdk-client-api-initialize) 中所述：
   + 更改 `ClientConfiguration` 对象以指向您的 Local 终端节点，例如 `http://localhost:9080`。
   + 设置目标实例集 ID 值。对于 Local，您不需要实际实例集 ID；可以将目标实例集设置为任意有效字符串（`^fleet-\S+`），例如 `fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d`。
   + 设置 AWS 凭证。对于 Local，您无需实际的 AWS 凭证，您可以将访问密钥和私有密钥设置为任意字符串。

   在 Local 命令提示符窗口中，在您启动游戏客户端之后，日志消息应指示它已初始化 `GameLiftClient`，并且已成功与 Amazon GameLift Servers 服务通信。

1. **测试游戏客户端对 Amazon GameLift Servers 服务的调用。**

   验证您的游戏客户端已成功进行任意或所有以下 API 调用：
   + [CreateGameSession()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreateGameSession.html)
   + [DescribeGameSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeGameSessions.html)
   + [CreatePlayerSession()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreatePlayerSession.html)
   + [CreatePlayerSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_CreatePlayerSessions.html)
   + [DescribePlayerSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribePlayerSessions.html)

   在 Local 命令提示符窗口中，只有对 `CreateGameSession()` 的调用才会产生日志消息。日志消息显示 Amazon GameLift Servers Local 何时提示您的游戏服务器启动游戏会话（`onStartGameSession` 回调）并在您的游戏服务器调用它时获取成功的 `ActivateGameSession`。在 AWS CLI 窗口中，记录导致响应或错误消息的所有 API 调用。

1. **确保您的游戏服务器正在验证新玩家连接。**

   创建游戏会话和玩家会话之后，建立与游戏会话的直接连接。

   在 Local 命令提示符窗口中，日志消息应显示游戏服务器已发送 `AcceptPlayerSession()` 请求来验证新玩家连接。如果您使用 AWS CLI 调用 `DescribePlayerSessions()`，玩家会话状态应从“Reserved”更改为“Active”。

1. **验证您的游戏服务器正在将游戏和玩家状态报告给 Amazon GameLift Servers 服务。**

   要让 Amazon GameLift Servers 管理玩家需求并正确报告指标，您的游戏服务器必须将各种状态报告回 Amazon GameLift Servers。验证 Local 正在记录与以下操作相关的事件。您可能还希望使用 AWS CLI 跟踪状态更改。
   + **玩家从游戏会话断开连接** – Amazon GameLift Servers Local 日志消息应显示游戏服务器调用了 `RemovePlayerSession()`。对 AWS CLI 的 `DescribePlayerSessions()` 调用应体现出状态从 `Active` 更改为 `Completed`。您还可以调用 `DescribeGameSessions()` 来检查游戏会话的当前玩家数减少了一个。
   + **游戏会话结束** – Amazon GameLift Servers Local 日志消息应显示游戏服务器调用了 `TerminateGameSession()`。
**注意**  
之前的指导是在结束游戏会话时调用 `TerminateGameSession()`。此方法在 Amazon GameLift Servers Server SDK v4.0.1 中已弃用。请参阅[结束游戏会话](gamelift-sdk-server-api.md#gamelift-sdk-server-shutdownsession)。
   + **服务器进程终止** – Amazon GameLift Servers Local 日志消息应显示游戏服务器调用了 `ProcessEnding()`。对 AWS CLI 的 `DescribeGameSessions()` 调用应体现出状态从 `Active` 更改为 `Terminated`（或 `Terminating`）。

## Local 的变化
<a name="integration-testing-local-special"></a>

使用 Amazon GameLift Servers Local 时，请记住以下内容：
+ 与 Amazon GameLift Servers Web 服务不同，Local 不跟踪服务器的运行状况和启动 `onProcessTerminate` 回调。Local 仅停止记录游戏服务器的运行状况报告。
+ 对于面向 AWS 软件开发工具包的调用，不验证实例集 ID，该 ID 可以是满足参数要求（`^fleet-\S+`）的任意字符串值。
+ 使用 Local 创建的游戏会话 ID 具有不同结构。它们包括字符串 `local`，如此处所示：

  ```
  arn:aws:gamelift:local::gamesession/fleet-123/gsess-56961f8e-db9c-4173-97e7-270b82f0daa6
  ```