

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

# 与游戏 client/server 互动 Amazon GameLift Servers
<a name="gamelift-sdk-interactions"></a>

Amazon GameLift Servers 托管解决方案中的组件以特定的方式相互交互，从而根据玩家需求运行游戏会话。本主题介绍当游戏服务器托管在 Amazon GameLift Servers 托管式 EC2 实例集、自管理式 Amazon GameLift Servers Anywhere 实例集或混合解决方案上时，各组件之间如何相互通信。

托管解决方案组件包括游戏服务器、Amazon GameLift Servers 服务、客户端后端服务和游戏客户端。游戏服务器使用 [Amazon GameLift Servers 服务器 SDK](reference-serversdk.md) 与 Amazon GameLift Servers 服务交互。后端服务使用[Amazon GameLift Servers服务 API](reference-awssdk.md)（ AWS SDK 的一部分）代表游戏客户端与服务进行交互。加入游戏会话时，游戏客户端使用游戏会话的唯一 IP 地址和端口号直接连接到游戏会话。

**Topics**
+ [交互示意图](#gamelift-sdk-interactions-diagram)
+ [交互行为](#gamelift-sdk-interactions-descriptions)

## 交互示意图
<a name="gamelift-sdk-interactions-diagram"></a>

下图说明了各游戏托管组件如何交互，让 Amazon GameLift Servers 服务可以跟踪游戏服务器可用性状态并根据玩家需求启动游戏会话。

![\[关键交互的游戏 client/server 行为，如本主题所述。\]](http://docs.aws.amazon.com/zh_cn/gameliftservers/latest/developerguide/images/combined_api_interactions_vsd.png)


## 交互行为
<a name="gamelift-sdk-interactions-descriptions"></a>

以下各节介绍了各个关键交互中的事件顺序。

### 初始化游戏服务器进程
<a name="gamelift-sdk-interactions-launch"></a>

启动时，一个游戏服务器进程会与 Amazon GameLift Servers 服务建立通信，并将其状态报告为已准备好托管游戏会话。

1. 游戏服务器可执行文件的新进程开始在托管资源上运行。

1. 游戏服务器进程按顺序调用以下服务器 SDK 操作：

   1. `InitSDK()`，用于初始化服务器 SDK、对服务器进程进行身份验证以及与 Amazon GameLift Servers 服务建立通信。

   1. `ProcessReady()`，用于传达已准备好托管游戏会话。此调用还会报告进程的连接信息（游戏客户端用来连接到游戏会话）以及其他信息。

   然后，服务器进程会等待 Amazon GameLift Servers 服务的提示。

1. Amazon GameLift Servers 将服务器进程的状态更新为 `ACTIVE`，可用于托管新游戏会话。

1. Amazon GameLift Servers 开始定期调用 `onHealthCheck` 回调，从服务器进程请求运行状况。这些调用在服务器进程保持活动状态期间会持续。服务器进程必须在一分钟内响应运行状况是否正常。如果服务器进程响应运行状况不正常或没有响应，Amazon GameLift Servers 服务就会在某个时间点更改服务器进程的活动状态，并停止发送启动游戏会话的请求。

### 创建游戏会话
<a name="gamelift-sdk-interactions-start"></a>

当玩家发起玩游戏请求后，Amazon GameLift Servers 服务会响应该请求并启动一个新的游戏会话。

1. 一位使用游戏客户端的玩家请求加入游戏会话。根据您的游戏处理玩家加入流程的方式，游戏客户端会向后端服务发送请求。

1. 如果玩家加入流程要求启动新游戏会话，后端服务会向 Amazon GameLift Servers 服务发送新建游戏会话的请求。此请求将调用服务 API 操作 `StartGameSessionPlacement()`。（作为替代方案，后端服务可能会调用 `StartMatchmaking()` 或 `CreateGameSession()`。）

1. Amazon GameLift Servers 服务以创建一个状态为 `PENDING` 的新 `GameSessionPlacement` 票证作为响应。它会将票证信息返回到后端服务，让后端服务可以跟踪放置票证状态和确定游戏会话何时可供玩家加入。有关更多信息，请参阅 [请参阅设置游戏会话置放通知。](queue-notification.md)。

1. Amazon GameLift Servers 服务启动游戏会话放置流程。它会确定要查看的实例集，并在这些实例集中搜索未托管游戏会话的活动服务器进程。在找到可用的服务器进程后，Amazon GameLift Servers 服务会执行以下操作：

   1. 使用游戏会话设置和来自放置请求的玩家数据创建 `GameSession` 对象，并将状态设置为 `ACTIVATING`。

   1. 提示服务器进程启动游戏会话。该服务将调用服务器进程的 `onStartGameSession` 回调并传递 `GameSession` 对象。

   1. 将服务器进程的游戏会话数更改为 `1`。

1. 服务器进程运行其 `onStartGameSession` 回调函数。当准备好接受玩家连接时，服务器进程将调用服务器 SDK 操作 `ActivateGameSession()` 并等待玩家连接。

1. Amazon GameLift Servers 服务使用服务器进程的连接信息更新 `GameSession` 对象（如对 `ProcessReady()` 的调用中所报告的那样），并将游戏会话状态设置为 `ACTIVE`。它还会将 `GameSessionPlacement` 票证状态更新为 `FULFILLED`。

1. 后端服务调用 `DescribeGameSessionPlacement()` 来检查票证状态并获取游戏会话信息。当游戏会话处于活动状态时，后端服务会通知游戏客户端并传递游戏会话连接信息。

1. 游戏客户端使用连接信息直接连接到游戏服务器进程并加入游戏会话。

### 向游戏中添加玩家
<a name="gamelift-sdk-interactions-add-player"></a>

游戏可以选择使用玩家会话来跟踪玩家与游戏会话的连接。玩家会话可以单独创建，也可以作为游戏会话放置请求的一部分创建。

1. 后端服务使用游戏会话 ID 调用服务 API 操作 `CreatePlayerSession()`。

1. Amazon GameLift Servers 服务检查游戏会话状态（必须为 `ACTIVE`）并在游戏会话中查找开放的玩家位置。如果有可用位置，该服务将执行以下操作：

   1. 创建新的 `PlayerSession` 对象并将其状态设置为 `RESERVED`。

   1. 使用玩家会话信息响应后端服务请求。

1. 后端服务将玩家会话信息和游戏会话连接信息一起传递给游戏客户端。

1. 游戏客户端使用连接信息和玩家会话 ID 直接连接到游戏服务器进程并请求加入游戏会话。

1. 为了响应游戏客户端的加入尝试，游戏服务器进程调用服务 API 操作 `AcceptPlayerSession()` 来验证玩家会话 ID。服务器进程接受或拒绝连接。

1. Amazon GameLift Servers 服务执行以下操作之一：

   1. 如果连接被接受，Amazon GameLift Servers 会将 `PlayerSession` 状态设置为 `ACTIVE` 并将 `PlayerSession` 传递到游戏服务器进程。

   1. 如果游戏服务器进程在最初的 `CreatePlayerSession()` 请求发出后的一段时间内没有为玩家会话 ID 调用 `AcceptPlayerSession()`，Amazon GameLift Servers 服务就会将 `PlayerSession` 状态更改为 `TIMEDOUT`，并在游戏会话中重新开放玩家位置。

### 删除玩家
<a name="gamelift-sdk-interactions-remove-player"></a>

对于使用玩家会话的游戏，当有玩家断开连接时，游戏服务器进程会通知 Amazon GameLift Servers 服务。该服务使用此信息来跟踪游戏会话中玩家位置的状态，并可以允许新玩家使用开放的位置。

1. 玩家断开与游戏会话的连接。

1. 游戏服务器进程检测到丢失的连接并调用服务器 SDK 操作 `RemovePlayerSession()`。

1. Amazon GameLift Servers 服务将玩家会话状态更改为 `COMPLETED`，并在游戏会话中重新开放玩家位置。

### 关闭游戏会话
<a name="gamelift-sdk-interactions-shutdown"></a>

在游戏会话结束或关闭游戏会话时，服务器进程会向 Amazon GameLift Servers 服务通知游戏会话状态。

1. 游戏服务器进程通过调用服务器 SDK 操作 `ProcessEnding()` 结束游戏会话并启动进程关闭。

1. 游戏服务器进程调用`Destroy()`以从内存中释放服务器 SDK。[遥测指标](monitoring-gamelift-servers-metrics.md)需要执行此步骤，以防止其将正常进程退出报告为崩溃。

1. Amazon GameLift Servers 服务将执行以下操作：

   1. 将游戏会话日志上传到 Amazon Simple Storage Service（Amazon S3）。

   1. 将游戏会话状态更改为 `TERMINATED`。

   1. 更改服务器进程状态为 `TERMINATED`。

   1. 根据托管解决方案的设计，分配新的可用托管资源来运行新的游戏服务器进程。