

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon GameLift Servers Local 測試您的整合
<a name="integration-testing-local"></a>

**注意**  
本主題僅涵蓋與適用於 3.x 和 4.x Amazon GameLift Servers版的伺服器 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 ServersAnywhere 機群進行本機測試。如需從 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 進行適當通訊，以啟動新遊戲工作階段、接受新玩家，以及報告運作狀況和狀態。
+ 您的遊戲用戶端已正確與適用於 的 AWS 開發套件整合，Amazon GameLift Servers並且能夠擷取現有遊戲工作階段的資訊、開始新的遊戲工作階段、加入玩家至遊戲，以及連線至遊戲工作階段。

Amazon GameLift Servers Local 是一種命令列工具，可啟動受管Amazon GameLift Servers服務的獨立版本。 Amazon GameLift ServersLocal 也提供伺服器程序初始化、運作狀態檢查，以及 API 呼叫和回應的執行事件日誌。 Amazon GameLift ServersLocal 會辨識 的 AWS SDK 動作子集Amazon GameLift Servers。您可以從 AWS CLI 或從遊戲用戶端進行呼叫。所有 API 動作都在本機執行，就像在 Amazon GameLift Servers web 服務中一樣。

每個伺服器程序應該只託管單一遊戲工作階段。遊戲工作階段是您用來連線至 Amazon GameLift Servers Local 的可執行檔。當遊戲工作階段完成時，您應該呼叫 `GameLiftServerSDK::ProcessEnding` ，然後結束程序。在本機測試時Amazon GameLift Servers，您可以啟動多個伺服器程序。每個程序都會連線至 Amazon GameLift Servers Local。然後，您可以為每個伺服器程序建立一個遊戲工作階段。當您的遊戲工作階段結束時，您的遊戲伺服器程序應該會結束。然後，您必須手動啟動另一個伺服器程序。

Amazon GameLift Servers local 支援下列 APIs：
+ CreateGameSession
+ CreatePlayerSession
+ CreatePlayerSessions
+ DescribeGameSessions
+ DescribePlayerSessions

## 設定Amazon GameLift Servers本機
<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 之前，您必須同時安裝下列項目。
+ 適用於 3.1.5 版至 4.x Amazon GameLift Servers版的伺服器 SDK 建置。
+ Java 8 

## 測試遊戲伺服器
<a name="integration-testing-local-server"></a>

如果您只想測試遊戲伺服器，您可以使用 AWS CLI 來模擬遊戲用戶端對 Amazon GameLift Servers Local 服務的呼叫。這會驗證您的遊戲伺服器是否依下列操作執行：
+ 遊戲伺服器會正確啟動並初始化適用於 的伺服器 SDKAmazon GameLift Servers。
+ 做為啟動程序的一部分，遊戲伺服器會通知 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 服務。這表示您的遊戲伺服器已成功初始化適用於 的伺服器 SDK Amazon GameLift Servers（使用 `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 找不到具有 pID 的程序：{{<process ID>}}！是否叫用 InitSDK()？」
   + 警告：「使用 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 的程式設計呼叫。您可以驗證下列動作：
+ 遊戲用戶端成功向 Amazon GameLift Servers Local 服務提出 AWS SDK 請求，包括建立遊戲工作階段、擷取現有遊戲工作階段的資訊，以及建立玩家工作階段。
+ 當玩家嘗試加入遊戲工作階段時，遊戲伺服器正確驗證玩家。對於已驗證的玩家，遊戲伺服器可能會擷取玩家資料 (如有實作)。
+ 當玩家離開遊戲時，遊戲伺服器會報告連接中斷。
+ 遊戲伺服器會報告結束遊戲工作階段。

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()`，則玩家工作階段狀態應從預留變更為作用中。

1. **驗證遊戲伺服器是否正在向 Amazon GameLift Servers 服務回報遊戲與玩家狀態。**

   為了讓 Amazon GameLift Servers 能管理玩家需求並確實報告指標，遊戲伺服器必須向 Amazon GameLift Servers 回報​各種狀態。驗證 Local 是否正在記錄與下列動作相關的事件。您也可以使用 AWS CLI 來追蹤狀態變更。
   + **玩家中斷與遊戲工作階段的連線** – Amazon GameLift Servers 本機日誌訊息應會顯示您的遊戲伺服器呼叫 `RemovePlayerSession()`。此外，系統對 `DescribePlayerSessions()`​ 所進行的 AWS CLI ​ 呼叫，應該會反映出狀態從 `Active`​ 變更為 `Completed`。您也可以呼叫 `DescribeGameSessions()`，檢查遊戲工作階段的目前玩家數目是否減一。
   + **遊戲工作階段結束** – Amazon GameLift Servers 本機日誌訊息應會顯示您的遊戲伺服器呼叫 `TerminateGameSession()`。
**注意**  
先前的指引是在結束遊戲工作階段`TerminateGameSession()`時呼叫 。此方法已用 Amazon GameLift Servers Server SDK v4.0.1 取代。請參閱 [結束遊戲工作階段](gamelift-sdk-server-api.md#gamelift-sdk-server-shutdownsession)。
   + **伺服器程序已終止** – Amazon GameLift Servers 本機日誌訊息應會顯示您的遊戲伺服器呼叫 `ProcessEnding()`。對 的 AWS CLI 呼叫`DescribeGameSessions()`應反映狀態從 `Active`變更為 `Terminated`（或 `Terminating`)。

## 本機 的變化
<a name="integration-testing-local-special"></a>

使用 Amazon GameLift Servers Local 時，請記住下列要項：
+ 與 Amazon GameLift Servers Web 服務不同，Local 不會追蹤伺服器的運作狀態，亦不會啟動 `onProcessTerminate` 回呼。Local 只會停止記錄遊戲伺服器的執行狀況報告。
+ 對於對 AWS SDK 的呼叫，機群 IDs 不會經過驗證，並且可以是符合參數需求 () 的任何字串值`^fleet-\S+`。
+ 使用 Local 建立的遊戲工作階段 ID 有不同的架構。它們包含字串 `local`，如下所示：

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