

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon GameLift Streams バックエンドサービスとウェブクライアント
<a name="sdk"></a>

 Amazon GameLift Streams を使用すると、ウェブブラウザを介してアプリケーションをストリーミングできます。Amazon GameLift Streams Web SDK を使用すると、バックエンドストリーミングサービスをセットアップできます。次に、エンドユーザーはウェブクライアントを介してストリームに接続します。クラウドを通じてゲームをプレイしたり、アプリケーションとやり取りしたりできます。

 Amazon GameLift Streams Web SDK には、バックエンドサービスの作成を開始するために使用できるサンプルバックエンドサーバーとサンプルウェブクライアントが含まれています。これらのサンプルを使用して、追加の開発なしで Amazon GameLift Streams のストリーミング方法をテストすることもできます。開始するには、「」を参照してください[Amazon GameLift Streams を使用したウェブサーバーとクライアントのセットアップ](setting-up-web-sdk.md)。

**Topics**
+ [サポートされているブラウザと入力](sdk-browsers-input.md)
+ [必要なポート](required-ports.md)
+ [Amazon GameLift Streams を使用したウェブサーバーとクライアントのセットアップ](setting-up-web-sdk.md)
+ [ストリームの外観をカスタマイズする](sdk-stream-appearance.md)
+ [ロケール設定](sdk-locale-support.md)
+ [マウスの移動処理](sdk-mouse-movement.md)
+ [アプリケーションとウェブクライアント間のデータチャネル通信](data-channels.md)

# サポートされているブラウザと入力
<a name="sdk-browsers-input"></a>

Amazon GameLift Streams ストリームとその互換性のある入力周辺機器を表示するためにサポートされているプラットフォームとブラウザを以下に示します。ブラウザは、H.264 とも呼ばれるアドバンストビデオコーディング (AVC) とも互換性がある必要があります。

全体として、特にゲームコントローラーとの最高のエンドユーザーエクスペリエンスと最大の互換性を実現するために、Google Chrome、Microsoft Edge、またはカスタム Chromium ベースのデスクトップアプリケーションをお勧めします。

 どのコントローラーがどのブラウザと互換性があるかの詳細については、[「Web Gamepad API](https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API)」を参照してください。Amazon GameLift Streams には一部のガイダンスが適用されない場合がありますが、ほとんどのゲームコントローラーは Bluetooth 経由で正常に接続することが予想されます。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/gameliftstreams/latest/developerguide/sdk-browsers-input.html)

## 既知の問題
<a name="sdk-browsers-input-known-issues"></a>

ブラウザと入力に関する既知の問題は次のとおりです。
+ Safari は、 `Esc` が押されるたびにすぐに全画面表示を終了します。これは上書きできません。
+ LinkedIn、Yelp、Instagram などのモバイルアプリ内などの「埋め込み」または「アプリ内」ブラウザビューは、iOS ではサポートされていません。これらは、リアルタイムのインタラクティブストリーミングに必要なブラウザ WebRTC サポートを無効にする傾向があります。標準以外のブラウザ文字列を検出し、Safari で を開くようにユーザーに求めることをお勧めします。
+ アプリケーションの画面解像度が 1080p に設定されていない場合、マウスの追跡に影響する可能性があります。可能であれば、他の解像度の選択を無効にすることをお勧めします。また、ウィンドウモードを無効にし、全画面でのみ実行することをお勧めします。
+ Proton でゲームコントローラーのプラグアンドプレイをサポートするには、ネイティブ Linux アプリケーションでサポートされていないにもかかわらず、Proton ランタイム環境で実行されているゲームには、クライアントに接続されていても、接続されているゲームコントローラーが*常に*表示されます。これは、コントローラーがアイドル状態で使用されていない場合でも、コントローラーの入力を求めるゲームの問題である可能性があります。ゲームでは、最後の入力方法に基づいて入力 UI を表示することをお勧めします。

## 制限事項
<a name="sdk-browsers-input-limits"></a>
+ ほとんどのランタイム環境は、Ubuntu 22.04 LTS を除くゲームコントローラーをサポートしています。ゲームコントローラーのサポートが必要な場合は、別のランタイム環境を使用してゲームを作成することを検討してください。他のランタイム環境のリストについては、「」を参照してください[ランタイム環境](configuration-options.md#configuration-options-runtime)。
+ PlayStation 5 および Luna ゲームコントローラーは Firefox ではサポートされていません。
+ 触覚フィードバックのサポート:
  + PlayStation 4 および Xbox Series S/X コントローラーに関する触覚フィードバックは、Chrome、Edge、Safari でサポートされています。
  + PlayStation 5 DualSense コントローラーの触覚は、Safari ブラウザでのみサポートされています。
  + Firefox は、コントローラーに関する触覚フィードバックをサポートしていません。
  + Android および iOS デバイスは、コントローラーに関する触覚フィードバックをサポートしていません。
+ Amazon GameLift **Streams コンソールのテスト**ストリーム機能はマイクをサポートしていません。

## IPv6 サポート
<a name="sdk-browsers-input-ipv6-support"></a>

IPv6-onlyクライアントへのストリーミングは、Windows ランタイムアプリケーションでのみサポートされています。


| 実行時間 | IPv4 経由のストリーミング | IPv6 経由のストリーミング | 
| --- | --- | --- | 
| Microsoft Windows Server 2022 Base | はい | はい | 
| Ubuntu 22.04 LTS | はい | なし | 
| Proton ランタイム | はい | なし | 

# 必要なポート
<a name="required-ports"></a>

 Amazon GameLift Streams を統合するには、ネットワークインフラストラクチャに必要なポートが開いていてアクセス可能であることを確認します。以下は、Amazon GameLift Streams と通信するためにネットワークで開く予定のポートのリストです。


| ポート | プロトコル | 目的 | 
| --- | --- | --- | 
|  443  |  (HTTPS) TCP  |  Amazon GameLift Streams を含む AWS APIs  | 
|  33435-33465  |  UDP  |  ウェブ RTC  | 

# Amazon GameLift Streams を使用したウェブサーバーとクライアントのセットアップ
<a name="setting-up-web-sdk"></a>

 このチュートリアルでは、Amazon GameLift Streams のストリーミングサービスを統合するウェブクライアントアプリケーションを設定します。次に、Amazon GameLift Streams Web SDK、JavaScript ライブラリ、および開始できるサンプルコードを使用します。サンプルコードには、シンプルな Amazon GameLift Streams バックエンドウェブサーバーとシンプルなウェブクライアントが含まれています。このチュートリアルを終了すると、サンプルコードを使用してストリームを開始できます。

 Amazon GameLift Streams を初めて使用する場合は、[Amazon GameLift Streams で最初のストリームを開始する](streaming-process.md)Amazon S3 にゲームをアップロードし、ブラウザの Amazon GameLift Streams コンソール内からストリーミングをテストするチュートリアルから始めることを強くお勧めします。

## 前提条件
<a name="setting-up-web-sdk-prereq"></a>
+ プログラムによるアクセスに適切な認証情報を持つ AWS アカウント。詳細については、「[開発者としての Amazon GameLift Streams のセットアップ](setting-up.md)」を参照してください。
+ AWS SDK。
+ Amazon GameLift Streams がサポートするウェブブラウザ — 「」を参照してください[サポートされているブラウザと入力](sdk-browsers-input.md)。
+ Node.js — [Node.js ダウンロード](https://nodejs.org/en/download)ページを参照してください。

## Web SDK のダウンロード
<a name="setting-up-web-sdk-materials"></a>

このチュートリアルでは、[入門製品ページの](https://aws.amazon.com/gamelift/streams/getting-started/)リソースセクションから次のマテリアルをダウンロードする必要があります。
+ **Amazon GameLift Streams Web SDK バンドル**: これには、シンプルなバックエンドサービスとウェブクライアントのサンプルコードが含まれます。
+ **Amazon GameLift Streams Web SDK API リファレンス**: この API リファレンスは、JavaScript 用の Amazon GameLift Streams API ラッパーを文書化します。

## ストリーミングリソースをセットアップする
<a name="setting-up-web-sdk-resources"></a>

ストリームを開始するには、アプリケーションとストリームグループというストリームリソースが必要です。具体的には、以下が必要です。
+  **準備完了**ステータスのアプリケーション。
+  使用可能なストリーム容量を持つ**アクティブ**ステータスのストリームグループ。
+  プライマリロケーション以外のロケーションでのストリーミングの場合、アプリケーションはそのロケーションへのレプリケーションを完了している必要があります。

 Amazon GameLift Streams コンソールまたは Amazon GameLift Streams CLI を使用してアプリケーションとストリームグループを設定するには、[Amazon GameLift Streams ストリームグループを使用してストリーミングを管理する](stream-groups.md)それぞれ [Amazon GameLift Streams でアプリケーションを準備する](applications.md)と を参照してください。または、Amazon GameLift Streams コンソールでのend-to-endのチュートリアルについては、「」を参照してください[Amazon GameLift Streams で最初のストリームを開始する](streaming-process.md)。

## バックエンドサーバーをセットアップする
<a name="setting-up-web-sdk-backend"></a>

 バックエンドサーバーは、ユーザーの認証、ストリームパラメータの設定、エンドユーザーに代わって Amazon GameLift Streams サービス API コールの実行などのタスクを処理します。セットアップの詳細については、サンプルコードと Amazon GameLift Streams Web SDK API リファレンスを参照してください。具体的には、Amazon GameLift Streams Web SDK パッケージの server.js ファイルを参照してください。

**重要**  
 このコードはテストおよび評価のみを目的としたサンプルコードであり、本番稼働用容量では使用しないでください。

**サンプルバックエンドサービスを実行するには**

1.  ターミナルまたはコマンドプロンプトを開き、フォルダ に移動します`AmazonGameLiftStreamsWebSDK\GameLiftStreamsSampleGamePublisherService\`。

1.  以下の コマンドを実行します。

   ```
   npm install
   node server.js
   ```

 サンプルバックエンドサービスを実行すると、エンドユーザーはウェブクライアントを介してストリームに接続できます。次のステップでウェブクライアントをテストします。

## ウェブクライアントを起動する
<a name="setting-up-web-sdk-client"></a>

ウェブクライアントアプリケーションは、Amazon GameLift Streams ストリームの受信とデコード、エンドユーザーへのストリーミング、エンドユーザーがアプリケーションとやり取りするためのウェブブラウザ UI の提供を担当します。JavaScript Amazon GameLift Streams Web SDK を独自のウェブクライアントアプリケーションに統合する方法の詳細については、サンプルコードと Amazon GameLift Streams Web SDK API リファレンスを参照してください。具体的には、Amazon GameLift Streams Web SDK パッケージ`public/index.html`の「」を参照してください。ブラウザでウェブクライアントを起動するときに、ウェブページのソースを確認することもできます。

**注記**  
Amazon GameLift Streams の Windows ランタイムは、IPv4 または IPv6 経由のストリームセッションをサポートします。ただし、Linux および Proton ランタイム環境は IPv4 経由のストリーミングのみをサポートします。

**ウェブクライアントアプリケーションを起動するには**

1.  ウェブブラウザを開き、 に移動します`http://localhost:port/`。ポート番号はバックエンドサーバーによって設定されます。デフォルトでは、これは HTTP ポート 8000 です。

1. ゲームをプレイするか、ソフトウェアを使用します。

   1. マウスなどの入力をアタッチするには、**入力をア**タッチを選択します。

   1. ゲームを終了するには、**Esc** キーを選択します。

   1. サーバープロセスを停止するには、**Ctrl\$1C** キーを選択します。

## ストリーミングリソースをクリーンアップする
<a name="setting-up-web-sdk-cleanup"></a>

**警告**  
 ストリームグループがストリーミング容量を割り当てた場合、その容量が未使用であってもコストが発生します。不要なコストを回避するには、ストリームグループを必要なサイズにスケールします。開発時には、ストリームグループの常時オン容量とターゲットアイドル容量を、使用していないときはゼロにスケーリングすることをお勧めします。詳細については、[ストリームグループを容量ゼロにスケールする](pricing.md#pricing-pause-stream-groups) を参照してください。

チュートリアルを完了し、アプリケーションをストリーミングする必要がなくなったら、以下の手順に従って Amazon GameLift Streams リソースをクリーンアップします。

**ストリームグループの削除**

 ストリームグループを削除すると、Amazon GameLift Streams はすべてのストリーム容量を解放するように動作します。

**Amazon GameLift Streams コンソールを使用してストリームグループを削除するには**

1.  にサインイン AWS マネジメントコンソール し、[Amazon GameLift Streams コンソール](https://console.aws.amazon.com/gameliftstreams/)を開きます。

1.  既存のストリームグループのリストを表示するには、ナビゲーションペインでストリーム**グループ**を選択します。

1.  削除するストリームグループの名前を選択します。

1.  ストリームグループの詳細ページで、**削除**を選択します。

1.  **削除**ダイアログボックスで、削除アクションを確認します。

 Amazon GameLift Streams は、コンピューティングリソースのリリースとストリームグループの削除を開始します。この間、ストリームグループは**削除**ステータスになります。Amazon GameLift Streams がストリームグループを削除すると、そのグループを取得できなくなります。

**アプリケーションの削除**

 削除できるのは、以下の条件を満たすアプリケーションだけです。
+  **[準備完了]** 状態または **[エラー]** 状態のアプリケーション。
+  進行中のどのストリームセッションでもストリーミングされていないアプリケーション。クライアントがストリームセッションを終了するまで待つか、Amazon GameLift Streams API の [TerminateStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_TerminateStreamSession.html) を呼び出してストリームを終了する必要があります。

 アプリケーションがいずれかのストリームグループにリンクされている場合は、削除する前に、関連するすべてのストリームグループからリンクを解除する必要があります。コンソールでは、このプロセスを説明するダイアログボックスが表示されます。

**Amazon GameLift Streams コンソールを使用してアプリケーションを削除するには**

1. にサインイン AWS マネジメントコンソール し、[Amazon GameLift Streams コンソール](https://console.aws.amazon.com/gameliftstreams/)を開きます。

1. ナビゲーションバーで、**アプリケーション**を選択して既存のアプリケーションのリストを表示します。削除するアプリケーションを選択します。

1. アプリケーションの詳細ページで、**削除**を選択します。

1. **削除**ダイアログボックスで、削除アクションを確認します。

 Amazon GameLift Streams がアプリケーションの削除を開始します。この間、アプリケーションは `Deleting`ステータスになります。Amazon GameLift Streams がアプリケーションを削除すると、アプリケーションを取得できなくなります。

# ストリームの外観をカスタマイズする
<a name="sdk-stream-appearance"></a>

## 画面のロード
<a name="sdk-loading-screen"></a>

顧客がウェブブラウザを開いてストリームを表示すると、ウェブクライアントは Amazon GameLift Streams ストリームセッションへの接続の確立を開始します。ストリームセッションのロード中に、顧客の画面にカスタム背景とロゴを表示できます。

Amazon GameLift Streams Web SDK サンプルクライアントは、 `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/loadingscreen.js` ファイルのフロントエンドウェブクライアントにアニメーションロゴを実装する方法を示しています。デフォルトのロード画面は、背景と前景の 2 つの画像で構成されます。前景画像は中央に配置され、パルスアニメーションがあります。アニメーションは、ストリームセッションの接続中にのみ再生されます。

**ロード画面を有効にするには**

1. Amazon GameLift Streams Web SDK サンプルクライアントで、 `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/`フォルダに移動します。

1. デフォルト名 および を使用して、背景イメージ`Background.png`とフォアグラウンドイメージを追加します`LoadingLogo.png`。名前を変更する場合、または別のイメージ形式を使用する場合は、 でコードを更新する必要があります`GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js`。

1. (オプション) で`GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js`、JavaScript コードを更新してさまざまなアニメーションを実装します。

# ロケール設定
<a name="sdk-locale-support"></a>

 Amazon GameLift Streams では、ストリームごとにロケール設定を設定できます。これは、アプリケーションが時間や通貨などの場所固有の情報をエンドユーザーのオペレーティングシステムから取得する場合に便利です。

 Amazon GameLift Streams は、次の言語をサポートしています。


| 値 | 説明 | 
| --- | --- | 
|  `en_US`  |  米国英語 (デフォルト)  | 
|  `ja_jp.UTF-8`  |  Japanese  | 

 **ロケール設定を変更するには** 

 Amazon GameLift Streams API を使用して [StartStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_StartStreamSession.html) を呼び出す場合は、 `LANG=<language>` を に追加します`AdditionalEnvironmentVariables`。ロケール設定はユーザーごとに一意であるため、ストリームセッションレベルで設定します。これを設定しない場合、ストリームはデフォルトで米国英語を使用します。

**Example 例**  

```
aws gameliftstreams start-stream-session \
   --identifier arn:aws:gameliftstreams:us-west-2:123456789012:streamgroup/1AB2C3De4 \
   --protocol WebRTC \
   --signal-request "[webrtc-ice-offer json string]" \
   --user-id xnshijwh \            
   --additional-environment-variables '{"LANG": "ja_JP.UTF-8"}'
```

# マウスの移動処理
<a name="sdk-mouse-movement"></a>

マウスの移動処理は、ストリーミングされたアプリケーションで応答性と直感的なユーザーエクスペリエンスを提供するために不可欠です。Amazon GameLift Streams は、アプリケーションのカーソル動作に基づいてマウス入力送信を自動的に最適化し、カーソルが非表示でも表示でもマウスの動きが自然に感じられるようにします。Amazon GameLift Streams がマウスイベントを処理する方法を理解すると、ストリーミングサービスとシームレスに連携し、可能な限り最高のユーザーエクスペリエンスを提供するアプリケーションを設計できます。

## マウス入力モード
<a name="sdk-mouse-input-modes"></a>

Amazon GameLift Streams は、マウスイベントをアプリケーションに送信するために 2 つの異なるモードを使用し、カーソルの可視性に基づいて適切なモードを自動的に選択します。

相対モード  
相対モードでは、マウスの更新は前の位置との小さな増分差として送信されます。このモードは、ファーストパーソンシューティング (FPS) ゲームや 3D 方向を使用するインターフェイスなど、正確で継続的なマウスの動き追跡を必要とするアプリケーションに最適です。Amazon GameLift Streams は、オペレーティングシステムのカーソルが非表示または完全に透過的である場合、相対モードを使用します。

絶対モード  
絶対モードでは、マウスカーソルの位置は正確な画面座標として送信されます。このモードは、point-and-clickゲームやクリック可能な要素を持つ UI など、正確なカーソル配置に依存するアプリケーションに適しています。Amazon GameLift Streams は、アプリケーションにカスタムカーソルイメージが表示されていても、オペレーティングシステムのカーソルが表示されるときに絶対モードを使用します。

この自動選択により、手動設定を必要とせずに、さまざまなアプリケーションタイプに最適なパフォーマンスが保証されます。

## ポインタロック
<a name="sdk-pointer-lock"></a>

ポインタロックは、特定の要素内のマウスカーソルをキャプチャし、カーソルを非表示にして、指定された領域からマウスカーソルを離れないようにするウェブ API 機能です。この機能は、視認可能なカーソルの気が散ったり、ウィンドウエッジに到達したりすることなく、カメラ制御や狙いを定めるために無制限のマウスの動きを必要とするゲームに特に役立ちます。

Amazon GameLift Streams は、Web SDK の `InputConfiguration`インターフェイスの `autoPointerLock`プロパティを通じて自動ポインタロック機能を提供します。この機能は [requestPointerLock API](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock) と統合され、直感的でコンテキスト対応のマウスキャプチャを提供します。

### 自動ポインタロックの動作
<a name="sdk-pointer-lock-behavior"></a>

Amazon GameLift Streams は、アプリケーションが全画面表示で、リモートカーソルがストリームホストに表示されない場合に、ポインタロックを自動的に有効にします。この動作は、一般的なゲーム開発パターンとよく一致します。
+ **FPS/TPS ゲームと 3D 方向制御** - ポインタは自動的にロックされ、カーソルは非表示になり、FPS ゲームプレイに不可欠な無制限のカメラ制御を提供します。
+ **Point-and-clickゲームと UI コントロール** - ゲームがメニューインタラクションまたは戦略ゲームプレイにカーソルを表示すると、ポインタは表示およびロック解除されたままになり、意図したユーザーエクスペリエンスが保持されます。

### 設定オプション
<a name="sdk-pointer-lock-configuration"></a>

`autoPointerLock` プロパティは、次の値を受け入れます。

`true`  
リモートカーソルが表示されない場合、マウスは常にキャプチャされます。

`false`  
カーソルの可視性に関係なく、マウスはキャプチャされません。

`'fullscreen'` (デフォルト)  
マウスは、ビデオ要素が全画面表示モードにあり、リモートカーソルが表示されない場合にのみキャプチャされます。

**重要**  
`autoPointerLock` プラットフォームの制限により、 は Safari ブラウザや iOS プラットフォームには影響しません。

## ベストプラクティス
<a name="sdk-mouse-best-practices"></a>

ストリーミングされたアプリケーションでマウスを最適に処理するには：
+ **常に全画面ストリーミング**する - サービスで正常に動作するには、アプリケーションがすでに全画面モードで実行されている必要があります。さらに、ブラウザのサポートを使用して、ストリームをフルスクリーン要素にして、最適なエンドユーザーエクスペリエンスを実現することをお勧めします。これにより、システムカーソルとソフトウェアカーソル間のアライメントの問題などの問題を回避できます。
+ **相対モーションのカーソルを非表示**にする - アプリケーションでマウスの相対モーション (FPS 形式のカメラコントロールやドラッグベースのインタラクションなど) が予想される場合は、それらのインタラクション中にオペレーティングシステムのカーソルを非表示にします。シナリオによっては、マウスダウンでカーソルを非表示にし、マウスアップで再度表示する必要がある場合があります。
+ **絶対配置のカーソルを表示する** - アプリケーションで UI インタラクションに正確なカーソル配置が必要な場合は、オペレーティングシステムのカーソルが表示されたままにして絶対座標モードを有効にします。
+ **さまざまな入力シナリオをテスト**する - Amazon GameLift Streams がカーソルの可視性の変化に基づいてモードを切り替える可能性があるため、アプリケーションが相対モードと絶対モードの両方を正しく処理していることを確認します。
+ **さまざまなウィンドウモードをテスト**する - 該当する場合は、ウィンドウモードと全画面モードの両方でアプリケーションのマウス処理をテストします。入力`autoPointerLock`設定に最適な設定を決定します。

# アプリケーションとウェブクライアント間のデータチャネル通信
<a name="data-channels"></a>

 データチャネルを使用すると、Amazon GameLift Streams アプリケーションとウェブクライアント (エンドユーザーのウェブブラウザで実行されている JavaScript コード) の間で任意のメッセージを安全に通信できます。これにより、エンドユーザーはストリームを表示しているウェブブラウザを介して、Amazon GameLift Streams がストリーミングしているアプリケーションとやり取りできます。

Amazon GameLift Streams のデータチャネルのユースケースの例を次に示します。
+ ユーザーはローカルブラウザでアプリケーションで URLs を開くことができます。
+ ユーザーはクリップボード内のコンテンツをアプリケーションに前後に渡すことができます。
+ ユーザーはローカルマシンからアプリケーションにコンテンツをアップロードできます。
+ 開発者は、アプリケーションにコマンドを送信する UI をブラウザに実装できます。
+ ユーザーはスキーマを渡して、視覚化レイヤーの表示を制御できます。

## 特徴
<a name="data-channels-features"></a>

**メッセージのサイズ制限**  
Amazon GameLift Streams Web SDK は、メッセージあたり 64 KB (65536 バイト) の最大サイズ制限を課します。これにより、メッセージサイズ制限がほとんどのブラウザと互換性があり、通信がストリームの合計帯域幅に与える影響が低くなります。

**メトリクス**  
 データチャネル使用状況のメトリクスは、ストリームセッションが終了すると AWS アカウントに送信されます。詳細については、「Amazon GameLift ストリームのモニタリング」セクション[データチャネル](monitoring-cloudwatch.md#monitoring-data-channels)の「」を参照してください。 * GameLift * 

## データチャネルの使用
<a name="data-channels-using"></a>

Amazon GameLift Streams Web SDK は、アプリケーションにバイト配列としてメッセージを送信する `sendApplicationMessage`関数を提供します。メッセージは、定義したコールバック関数によって処理`clientConnection.applicationMessage`されます。

アプリケーションがデータチャネルポートに接続する前にクライアントがメッセージを送信すると、メッセージはキューに入れられます。次に、アプリケーションが接続すると、メッセージを受信します。ただし、クライアントがデータチャネルポートに接続する前にアプリケーションがメッセージを送信すると、メッセージは失われます。アプリケーションは、メッセージを送信する前にクライアントの接続状態を確認する必要があります。

## クライアント側
<a name="data-channels-using-client"></a>

ウェブクライアントアプリケーションに次のコードを記述します。

1.  アプリケーションから受信メッセージを受信するコールバック関数を定義します。

   ```
   function streamApplicationMessageCallback(message) {
       console.log('Received ' + message.length + ' bytes of message from 
       Application');
   }
   ```

1.  `clientConnection.applicationMessage` をコールバック関数に設定します。

   ```
   clientConnection: {
       connectionState: streamConnectionStateCallback,
       channelError: streamChannelErrorCallback,
       serverDisconnect: streamServerDisconnectCallback,
       applicationMessage: streamApplicationMessageCallback,
   }
   ```

1.  `GameLiftStreams.sendApplicationMessage` 関数を呼び出して、アプリケーションにメッセージを送信します。これは、ストリームセッションがアクティブで入力がアタッチされている限り、いつでも呼び出すことができます。

例として、Amazon GameLift Streams Web SDK サンプルクライアントを参照してください。このクライアントは、クライアント側でシンプルなデータチャネルを設定する方法を示しています。

## アプリケーション側
<a name="data-channels-using-application"></a>

アプリケーションに次のロジックを記述します。

### ステップ 1. データチャネルポートに接続する
<a name="data-channels-using-application-1"></a>

アプリケーションが起動したら、 `40712`のポートに接続します`localhost`。アプリケーションは、実行期間中、この接続を維持する必要があります。アプリケーションが接続を閉じると、再度開くことはできません。

### ステップ 2. イベントをリッスンする
<a name="data-channels-using-application-2"></a>

イベントは固定サイズのヘッダーで始まり、その後に可変長の関連データが続きます。アプリケーションがイベントを受け取ったら、イベントを解析して情報を取得します。

**Event format**
+ **ヘッダー**: 形式の 4 バイトヘッダー `abcc`
  +  `a` : クライアント ID バイト。これは、複数の接続 (切断と再接続による) の場合に、特定のクライアント接続を識別します。
  +  `b` : イベントタイプのバイト。 - `0` 接続されたクライアント、 - `1` 接続されていないクライアント、 `2` - クライアントからメッセージが送信されます。その他のイベントタイプは、今後の Amazon GameLift Streams サービスの更新で受信される可能性があるため、無視する必要があります。
  +  `cc` : 関連付けられたイベントデータの長さ。これは、ビッグエンディアンの順序で 2 バイトとして表されます (最初のバイトが最も重要です）。イベントタイプが 2 の場合、イベントデータはクライアントからのメッセージの内容を表します。
+ **データ**: 残りのバイトには、クライアントメッセージなどのイベントデータが含まれます。データの長さは、 ヘッダー`cc`の で示されます。

**イベントをリッスンするには**

1. 4 つのヘッダーバイトを読み取って、クライアント ID、イベントタイプ、イベントデータの長さを取得します。

1. ヘッダーで説明されている長さに従って、クライアント ID とイベントタイプに関係なく、可変長イベントデータを読み取ります。イベントデータがバッファに残されないように、データを無条件に読み取ることが重要です。バッファには、次のイベントヘッダーと混同される可能性があります。イベントタイプに基づいてデータの長さを推測しないでください。

1. アプリケーションで認識された場合は、イベントタイプに基づいて適切なアクションを実行します。このアクションには、着信接続または切断のログ記録、クライアントメッセージの解析、アプリケーションロジックのトリガーなどがあります。

### ステップ 3. クライアントにメッセージを送信する
<a name="data-channels-using-application-3"></a>

アプリケーションは、受信イベントで使用されるのと同じ 4 バイトのヘッダー形式でメッセージを送信する必要があります。

**クライアントにメッセージを送信するには**

1. 次のプロパティを使用して ヘッダーを書き込みます。

   1. `a` : クライアント ID バイト。メッセージがクライアントメッセージに応答している場合は、古いクライアント接続から新しく再接続されたクライアントに応答を配信するなどの競合状態を避けるため、受信クライアントメッセージと同じクライアント ID を再利用する必要があります。アプリケーションが未承諾メッセージをクライアントに送信している場合は、最新の「クライアント接続」イベント (イベントタイプ 0) と一致するようにクライアント ID を設定する必要があります。

   1. `b` : 送信メッセージのイベントタイプは常に 2 である必要があります。クライアントは、他のイベントタイプのメッセージを無視します。

   1. `cc` : メッセージの長さ、バイト単位。

1. メッセージバイトを書き込みます。

クライアントが切断しない限り、メッセージは指定されたクライアントに配信されます。切断されたクライアントが再接続すると、クライアント接続イベントを介して新しいクライアント ID が割り当てられます。古いクライアント ID の未配信メッセージはすべて破棄されます。

**Example**  
次の擬似コードは、アプリケーション側でメッセージを伝えるロジックを示しています。Winsock を使用した完全な例については、Windows Sockets 2 ドキュメントの[「Winsock クライアントコードの完了](https://learn.microsoft.com/en-us/windows/win32/winsock/complete-client-code)」を参照してください。  

```
connection = connect_to_tcp_socket("localhost:40712")
loop:
    while has_pending_bytes(connection):
        client_id = read_unsigned_byte(connection)
        event_type = read_unsigned_byte(connection)
        event_length = 256 * read_unsigned_byte(connection)
        event_length = event_length + read_unsigned_byte(connection)
        event_data = read_raw_bytes(connection, event_length)
        if message_type == 0:
            app_process_client_connected(client_id)
        else if message_type == 1:
            app_process_client_disconnected(client_id)
        else if message_type == 2:
            app_process_client_message(client_id, event_data)
        else:
            log("ignoring unrecognized event type")
    while app_has_outgoing_messages():
        target_client_id, message_bytes = app_next_outgoing_message()
        message_length = length(message_bytes)
        write_unsigned_byte(connection, target_client_id)
        write_unsigned_byte(connection, 2)
        write_unsigned_byte(connection, message_length / 256)
        write_unsigned_byte(connection, message_length mod 256)
        write_raw_bytes(connection, message_bytes)
```