

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Servicio de backend y cliente web de Amazon GameLift Streams
<a name="sdk"></a>

 Amazon GameLift Streams le permite transmitir aplicaciones a través de un navegador web. Con el SDK web de Amazon GameLift Streams, puede configurar un servicio de streaming de back-end. Luego, los usuarios finales se conectan a una transmisión a través de un cliente web. Pueden jugar a tu juego o interactuar con tu aplicación a través de la nube. 

 El SDK web de Amazon GameLift Streams incluye un ejemplo de servidor de backend y un cliente web de ejemplo, que puede utilizar para empezar a crear un servicio de backend. También puede usar estos ejemplos para probar cómo Amazon GameLift Streams transmite, sin necesidad de desarrollo adicional. Para empezar, consulte[Configuración de un servidor web y un cliente con Amazon GameLift Streams](setting-up-web-sdk.md). 

**Topics**
+ [Navegadores y entradas compatibles](sdk-browsers-input.md)
+ [Puertos necesarios](required-ports.md)
+ [Configuración de un servidor web y un cliente con Amazon GameLift Streams](setting-up-web-sdk.md)
+ [Personalice la apariencia de la transmisión](sdk-stream-appearance.md)
+ [Preferencia de configuración regional](sdk-locale-support.md)
+ [Manejo del movimiento del ratón](sdk-mouse-movement.md)
+ [Comunicación por canal de datos entre una aplicación y un cliente web](data-channels.md)

# Navegadores y entradas compatibles
<a name="sdk-browsers-input"></a>

A continuación se enumeran las plataformas y los navegadores compatibles para ver las GameLift transmisiones de Amazon Streams y sus periféricos de entrada compatibles. Los navegadores también deben ser compatibles con la codificación de vídeo avanzada (AVC), también conocida como H.264.

En general, recomendamos Google Chrome, Microsoft Edge o una aplicación de escritorio personalizada basada en Chromium para obtener la mejor experiencia de usuario final y la máxima compatibilidad, especialmente con los controladores de juegos.

 [Para obtener más información sobre qué mandos son compatibles con qué navegadores, consulta la API de Web Gamepad.](https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API) Aunque es posible que algunas directrices no se apliquen a Amazon GameLift Streams, esperamos que la mayoría de los mandos de juegos se conecten correctamente a través de Bluetooth. 

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

## Problemas conocidos
<a name="sdk-browsers-input-known-issues"></a>

A continuación se indican los problemas conocidos relacionados con los navegadores y la entrada:
+ Safari saldrá inmediatamente de la pantalla completa cada vez que `Esc` se pulse. Esto no se puede anular.
+ Las vistas de navegador «integradas» o «integradas en la aplicación», como las que se encuentran dentro de las aplicaciones móviles LinkedIn, como Yelp, Instagram y otras, no son compatibles con iOS. Estos tienden a deshabilitar el soporte WebRTC del navegador necesario para la transmisión interactiva en tiempo real. Recomendamos detectar cadenas de navegador no estándar y pedir al usuario que las abra en Safari.
+ Si la resolución de pantalla de tu aplicación no está configurada en 1080p, es posible que el seguimiento del ratón se vea afectado. Recomendamos deshabilitar la selección de cualquier otra resolución, si es posible. También recomendamos desactivar el modo ventana y ejecutarlo solo en pantalla completa.
+ Para admitir los controladores de juegos plug and play en Proton, a pesar de la falta de soporte para ellos en las aplicaciones nativas de Linux, los juegos que se ejecutan en entornos de tiempo de ejecución de Proton *siempre* mostrarán un mando de juego conectado, incluso si no hay ninguno conectado al cliente. Esto podría ser un problema en el caso de los juegos que solicitan la entrada del mando incluso cuando el mando está inactivo y sin uso. Recomendamos que los juegos muestren la interfaz de usuario de entrada en función del último método de entrada.

## Limitaciones
<a name="sdk-browsers-input-limits"></a>
+ La mayoría de los entornos de ejecución admiten controladores de juegos, excepto Ubuntu 22.04 LTS. Si necesitas compatibilidad con un mando de juego, considera la posibilidad de crear el juego en otro entorno de ejecución. Para obtener una lista de otros entornos de ejecución, consulta[Entornos de ejecución](configuration-options.md#configuration-options-runtime).
+ Los mandos de juego PlayStation 5 y Luna no son compatibles con Firefox.
+ Soporte de retroalimentación háptica:
  + La retroalimentación háptica de los S/X mandos de las series PlayStation 4 y Xbox es compatible con Chrome, Edge y Safari.
  + La tecnología háptica del DualSense mando PlayStation 5 solo es compatible con el navegador Safari.
  + Firefox no admite la retroalimentación háptica en ningún mando.
  + Los dispositivos Android e iOS no admiten la retroalimentación háptica en ningún mando.
+ La función **Test Stream** de la consola de Amazon GameLift Streams no admite micrófonos.

## IPv6 soporte
<a name="sdk-browsers-input-ipv6-support"></a>

La transmisión IPv6 solo a clientes es compatible con las aplicaciones de tiempo de ejecución de Windows.


| Tiempo de ejecución | Transmitiendo por IPv4 | Transmitiendo IPv6 | 
| --- | --- | --- | 
| Microsoft Windows Server 2022 Base | Sí | Sí | 
| Ubuntu 22.04 LTS | Sí | No | 
| Tiempos de ejecución de Proton | Sí | No | 

# Puertos necesarios
<a name="required-ports"></a>

 Para integrar Amazon GameLift Streams, asegúrese de que su infraestructura de red tenga los puertos necesarios abiertos y accesibles. La siguiente es una lista de los puertos que debería tener abiertos en su red para comunicarse con Amazon GameLift Streams. 


| Puerto | Protocolo | Finalidad | 
| --- | --- | --- | 
|  443  |  (HTTPS) TCP  |  AWS APIs, incluido Amazon GameLift Streams  | 
|  33435-33465  |  UDP  |  Web RTC  | 

# Configuración de un servidor web y un cliente con Amazon GameLift Streams
<a name="setting-up-web-sdk"></a>

 En este tutorial, configurará una aplicación de cliente web que integra el servicio de streaming GameLift de Amazon Streams. A continuación, utilizará el SDK web de Amazon GameLift Streams, una JavaScript biblioteca y un código de ejemplo con los que podrá empezar. El código de muestra incluye un servidor web back-end simple de Amazon GameLift Streams y un cliente web simple. Al final de este tutorial, puedes iniciar una transmisión con el código de ejemplo. 

 Si es la primera vez que utiliza Amazon GameLift Streams, le recomendamos encarecidamente que comience con el [Comenzar tu primera transmisión en Amazon GameLift Streams](streaming-process.md) tutorial, en el que se explica cómo cargar un juego en Amazon S3 y cómo probar el streaming desde la consola de Amazon GameLift Streams de su navegador. 

## Requisitos previos
<a name="setting-up-web-sdk-prereq"></a>
+ Una cuenta de AWS con las credenciales adecuadas para el acceso programático. Para obtener más información, consulte [Configuración de Amazon GameLift Streams como desarrollador](setting-up.md).
+ El SDK de AWS.
+ Un navegador web GameLift compatible con Amazon Streams: consulte. [Navegadores y entradas compatibles](sdk-browsers-input.md)
+ Node.js: consulte la página de [descargas de Node.js](https://nodejs.org/en/download).

## Descargue el SDK web
<a name="setting-up-web-sdk-materials"></a>

Para este tutorial, tendrá que descargar los siguientes materiales de la sección de recursos de la [página de introducción del producto](https://aws.amazon.com/gamelift/streams/getting-started/):
+ **Paquete de SDK web de Amazon GameLift Streams**: incluye código de muestra para un servicio de backend y un cliente web sencillos.
+ **Referencia de la API del SDK web de Amazon GameLift Streams**: esta referencia de API documenta los contenedores de API de Amazon GameLift Streams para JavaScript.

## Configura tus recursos de streaming
<a name="setting-up-web-sdk-resources"></a>

Debe tener recursos de transmisión (una aplicación y un grupo de transmisiones) para iniciar una transmisión. En concreto, debe tener:
+  Una solicitud en estado **lista**. 
+  Un grupo de transmisiones en estado **activo** con capacidad de transmisión disponible. 
+  Para la transmisión en ubicaciones distintas de la ubicación principal, la aplicación debe haber terminado de replicarse en esa ubicación. 

 Para configurar una aplicación y un grupo de GameLift transmisiones mediante la consola de Amazon Streams o la CLI de Amazon GameLift Streams, consulte [Preparar una aplicación en Amazon GameLift Streams](applications.md) y[Gestione la transmisión con un grupo de GameLift transmisiones de Amazon Streams](stream-groups.md), respectivamente. Como alternativa, para ver un end-to-end tutorial en la consola de Amazon GameLift Streams, consulte. [Comenzar tu primera transmisión en Amazon GameLift Streams](streaming-process.md) 

## Configure un servidor back-end
<a name="setting-up-web-sdk-backend"></a>

 El servidor backend es responsable de gestionar tareas como la autenticación de los usuarios, la configuración de los parámetros de transmisión y la realización de llamadas a la API del servicio Amazon GameLift Streams en nombre de los usuarios finales. Consulte el código de ejemplo y la referencia de la API del SDK web de Amazon GameLift Streams para obtener más información sobre cómo configurarlo. En concreto, consulte el archivo server.js del paquete Amazon GameLift Streams Web SDK. 

**importante**  
 Este código es un ejemplo de código únicamente con fines de prueba y evaluación y no debe utilizarse en una capacidad de producción. 

**Para ejecutar el ejemplo del servicio de backend**

1.  Abre un terminal o una línea de comandos y navega hasta la carpeta`AmazonGameLiftStreamsWebSDK\GameLiftStreamsSampleGamePublisherService\`. 

1.  Ejecute los siguientes comandos : 

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

 Con el ejemplo de servicio de backend en ejecución, los usuarios finales pueden conectarse a una transmisión a través del cliente web. Pruebe el cliente web en el siguiente paso. 

## Lance un cliente web
<a name="setting-up-web-sdk-client"></a>

La aplicación cliente web es responsable de recibir y decodificar las GameLift transmisiones de Amazon Streams, de transmitirlas a los usuarios finales y de proporcionar la interfaz de usuario del navegador web para que los usuarios finales interactúen con la aplicación. Consulte el código de ejemplo y la referencia de la API del SDK web de Amazon GameLift Streams para obtener más información sobre cómo integrar el SDK web de JavaScript Amazon GameLift Streams en su propia aplicación de cliente web. En concreto, consulte `public/index.html` el paquete Amazon GameLift Streams Web SDK. También puede consultar la fuente de la página web al lanzar un cliente web en su navegador.

**nota**  
El motor de ejecución de Windows en Amazon GameLift Streams admite sesiones de streaming a través de IPv4 o IPv6. Sin embargo, los entornos de ejecución de Linux y Proton solo admiten la transmisión. IPv4

**Para lanzar una aplicación de cliente web**

1.  Abra un navegador web y navegue hasta`http://localhost:port/`. El número de puerto lo establece el servidor backend; de forma predeterminada, es el puerto HTTP 8000. 

1. Juega el juego o usa el software.

   1. Para adjuntar una entrada, como el ratón, selecciona **Adjuntar entrada**.

   1. Para salir del juego, pulsa la tecla **Esc**.

   1. Para detener el proceso del servidor, selecciona la **tecla Ctrl\$1C**.

## Limpia los recursos de streaming
<a name="setting-up-web-sdk-cleanup"></a>

**aviso**  
 Un grupo de transmisiones incurre en costos cuando tiene capacidad de transmisión asignada, incluso si esa capacidad no se utiliza. Para evitar costes innecesarios, escala tus grupos de streaming al tamaño que necesites. Durante el desarrollo, le sugerimos que reduzca a cero la capacidad permanente y la capacidad inactiva objetivo de sus grupos de transmisiones cuando no estén en uso. Para obtener más información, consulta [Escale los grupos de streaming a una capacidad cero](pricing.md#pricing-pause-stream-groups).

Cuando hayas completado el tutorial y ya no necesites transmitir tu solicitud en streaming, sigue estos pasos para limpiar tus recursos de Amazon GameLift Streams.

**Eliminar un grupo de transmisiones**

 Al eliminar un grupo de GameLift transmisiones, Amazon Streams trabaja para liberar toda la capacidad de transmisión. 

**Para eliminar un grupo de transmisiones mediante la consola de Amazon GameLift Streams**

1.  Inicie sesión en la [consola de Amazon GameLift Streams Consola de administración de AWS y ábrala](https://console.aws.amazon.com/gameliftstreams/). 

1.  Para ver una lista de sus grupos de transmisiones existentes, en el panel de navegación, seleccione **Grupos de transmisiones**. 

1.  Elige el nombre del grupo de transmisiones que deseas eliminar. 

1.  En la página de detalles del grupo de transmisiones, selecciona **Eliminar**. 

1.  En el cuadro de diálogo **Eliminar**, confirme la acción de eliminación. 

 Amazon GameLift Streams comienza a liberar recursos de cómputo y a eliminar el grupo de transmisiones. Durante este tiempo, el grupo de transmisiones está en estado de **eliminación**. Una vez que Amazon GameLift Streams elimine el grupo de transmisiones, ya no podrá recuperarlo. 

**Eliminar una aplicación**

 Solo puede eliminar una aplicación que cumpla las siguientes condiciones: 
+  La aplicación está en estado **Listo** o **Error**. 
+  Una aplicación no está transmitiendo en ninguna sesión de transmisión en curso. Debe esperar a que el cliente finalice la sesión de transmisión o llamar a [TerminateStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_TerminateStreamSession.html)la API de Amazon GameLift Streams para finalizar la transmisión. 

 Si la aplicación está vinculada a algún grupo de transmisiones, debe desvincularla de todos los grupos de transmisiones asociados antes de poder eliminarla. En la consola, un cuadro de diálogo le guiará a través de este proceso. 

**Para eliminar una aplicación mediante la consola de Amazon GameLift Streams**

1. Inicie sesión en la [consola de Amazon GameLift Streams Consola de administración de AWS y ábrala](https://console.aws.amazon.com/gameliftstreams/).

1. En la barra de navegación, selecciona **Aplicaciones** para ver una lista de las aplicaciones existentes. Elija la aplicación que desee eliminar. 

1. En la página de detalles de la aplicación, selecciona **Eliminar**. 

1. En el cuadro de diálogo **Eliminar**, confirme la acción de eliminación. 

 Amazon GameLift Streams comienza a eliminar la aplicación. Durante este tiempo, la solicitud está en `Deleting` estado. Una vez que Amazon GameLift Streams elimine la aplicación, ya no podrá recuperarla. 

# Personalice la apariencia de la transmisión
<a name="sdk-stream-appearance"></a>

## Pantalla de carga
<a name="sdk-loading-screen"></a>

Cuando un cliente abre un navegador web para ver una transmisión, el cliente web comienza a establecer una conexión con la sesión de transmisión de Amazon GameLift Streams. Mientras se carga la sesión de transmisión, puedes mostrar un fondo y un logotipo personalizados en la pantalla del cliente.

El cliente de ejemplo de Amazon GameLift Streams Web SDK, en el `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/loadingscreen.js` archivo, muestra cómo puede implementar un logotipo animado en su cliente web front-end. La pantalla de carga predeterminada consta de 2 imágenes: de fondo y de primer plano. La imagen de primer plano está situada en el centro y tiene una animación de pulsos. La animación solo se reproduce mientras la sesión de transmisión está conectada.

**Para activar una pantalla de carga**

1. En el cliente de ejemplo de Amazon GameLift Streams Web SDK, navegue hasta la `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/` carpeta.

1. Añada sus imágenes de fondo y primer plano con los nombres predeterminados `Background.png` y`LoadingLogo.png`. Si desea cambiarles el nombre o utilizar un formato de imagen diferente, debe actualizar el `GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js` código.

1. (Opcional) En`GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js`, actualiza el JavaScript código para implementar diferentes animaciones.

# Preferencia de configuración regional
<a name="sdk-locale-support"></a>

 En Amazon GameLift Streams, puede establecer la preferencia de configuración regional por transmisión. Esto resulta útil si la aplicación recupera información específica de la ubicación del sistema operativo del usuario final, como la hora o la moneda. 

 Amazon GameLift Streams admite los siguientes idiomas: 


| Valor | Description (Descripción) | 
| --- | --- | 
|  `en_US`  |  Inglés de EE. UU. (predeterminado)  | 
|  `ja_jp.UTF-8`  |  Japonés  | 

 **Para cambiar la configuración regional** 

 Cuando llames [StartStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_StartStreamSession.html)mediante la API de Amazon GameLift Streams, `LANG=<language>` agrégala a tu`AdditionalEnvironmentVariables`. Como la preferencia de configuración regional es única para cada usuario, se establece en el nivel de la sesión de streaming. Si no lo configuras, la transmisión utilizará el inglés estadounidense de forma predeterminada. 

**Example Ejemplo**  

```
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"}'
```

# Manejo del movimiento del ratón
<a name="sdk-mouse-movement"></a>

El manejo del movimiento del ratón es fundamental para ofrecer experiencias de usuario intuitivas y con capacidad de respuesta en las aplicaciones de streaming. Amazon GameLift Streams optimiza automáticamente la transmisión de las entradas del ratón en función del comportamiento del cursor de la aplicación, lo que garantiza que los movimientos del ratón sean naturales tanto si el cursor está oculto como si está visible. Entender cómo Amazon GameLift Streams procesa los eventos del ratón le ayuda a diseñar aplicaciones que funcionan a la perfección con el servicio de streaming y ofrecen la mejor experiencia de usuario posible.

## Modos de entrada del ratón
<a name="sdk-mouse-input-modes"></a>

Amazon GameLift Streams utiliza dos modos distintos para transmitir los eventos del ratón a su aplicación y selecciona automáticamente el modo adecuado en función de la visibilidad del cursor:

Modo relativo  
En el modo relativo, las actualizaciones del ratón se transmiten como pequeñas diferencias incrementales con respecto a la posición anterior. Este modo es ideal para aplicaciones que requieren un seguimiento preciso y continuo del movimiento del ratón, como los juegos de disparos en primera persona (FPS) o las interfaces que utilizan la orientación 3D. Amazon GameLift Streams utiliza el modo relativo cuando el cursor del sistema operativo está oculto o es totalmente transparente.

Modo absoluto  
En el modo absoluto, la posición del cursor del ratón se transmite como una coordenada exacta de la pantalla. Este modo funciona bien para aplicaciones que dependen de una posición precisa del cursor, como point-and-click juegos o cualquier interfaz de usuario con elementos en los que se pueda hacer clic. Amazon GameLift Streams utiliza el modo absoluto cuando el cursor del sistema operativo está visible, incluso si la aplicación muestra una imagen de cursor personalizada.

Esta selección automática garantiza un rendimiento óptimo para diferentes tipos de aplicaciones sin necesidad de una configuración manual.

## Bloqueo del puntero
<a name="sdk-pointer-lock"></a>

El bloqueo del puntero es una función de la API web que captura el cursor del ratón dentro de un elemento específico, lo oculta e impide que salga del área designada. Esta función es especialmente útil para los juegos que requieren mover el ratón sin restricciones para controlar la cámara o apuntar, sin la distracción de un cursor visible ni la limitación de llegar a los bordes de la ventana.

Amazon GameLift Streams proporciona la funcionalidad de bloqueo automático del puntero a través de la `autoPointerLock` propiedad de la `InputConfiguration` interfaz del SDK web. Esta función se integra con la [requestPointerLock API](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock) para permitir una captura del ratón intuitiva y adaptada al contexto.

### Comportamiento de bloqueo automático del puntero
<a name="sdk-pointer-lock-behavior"></a>

Amazon GameLift Streams habilita automáticamente el bloqueo del puntero cuando la aplicación está en pantalla completa y el cursor remoto es invisible en el anfitrión de la transmisión. Este comportamiento se alinea bien con los patrones de desarrollo de juegos más comunes:
+ **Juegos FPS/TPS y control de orientación 3D**: el puntero se bloquea automáticamente y el cursor se oculta, lo que permite controlar la cámara sin restricciones, algo esencial para los juegos de FPS.
+ **Point-and-click juegos y control de la interfaz** de usuario: cuando los juegos hacen que el cursor esté visible para interactuar con los menús o jugar de estrategia, el puntero permanece visible y desbloqueado, lo que preserva la experiencia de usuario prevista.

### Opciones de configuración
<a name="sdk-pointer-lock-configuration"></a>

La `autoPointerLock` propiedad acepta los siguientes valores:

`true`  
El ratón siempre se captura cuando el cursor remoto es invisible.

`false`  
El ratón nunca se captura, independientemente de la visibilidad del cursor.

`'fullscreen'` (predeterminado)  
El ratón solo se captura cuando el elemento de vídeo está en modo de pantalla completa y el cursor remoto es invisible.

**importante**  
`autoPointerLock`no tiene efecto en el navegador Safari ni en las plataformas iOS debido a las limitaciones de la plataforma.

## Prácticas recomendadas
<a name="sdk-mouse-best-practices"></a>

Para garantizar un manejo óptimo del ratón en las aplicaciones de streaming:
+ **Transmita siempre a pantalla completa**: su aplicación ya debería estar ejecutándose en modo de pantalla completa para que funcione correctamente en nuestro servicio. Además, recomendamos utilizar el soporte del navegador para convertir la transmisión en un elemento de pantalla completa y, así, ofrecer la mejor experiencia al usuario final. Esto ayudará a evitar problemas como los de alineación entre el cursor del sistema y el cursor del software.
+ **Oculta el cursor para mantener un movimiento relativo**: si tu aplicación espera un movimiento relativo del ratón (como los controles de cámara tipo FPS o las interacciones basadas en el arrastre), oculta el cursor del sistema operativo durante esas interacciones. En algunos casos, es posible que tengas que ocultar el cursor al colocar el ratón hacia abajo y volver a mostrarlo al levantarlo.
+ **Muestre el cursor para obtener un posicionamiento absoluto**: si su aplicación necesita un posicionamiento preciso del cursor para las interacciones con la interfaz de usuario, asegúrese de que el cursor del sistema operativo permanezca visible para habilitar el modo de coordenadas absolutas.
+ **Pruebe diferentes escenarios de entrada**: compruebe que su aplicación gestiona correctamente los modos de ratón relativo y absoluto, ya que Amazon GameLift Streams puede cambiar de un modo a otro en función de los cambios en la visibilidad del cursor.
+ **Pruebe diferentes modos de ventana**: pruebe el manejo del ratón de su aplicación tanto en el modo de ventana como en el de pantalla completa, si corresponde. Determine qué `autoPointerLock` configuración es la mejor para su configuración de entrada.

# Comunicación por canal de datos entre una aplicación y un cliente web
<a name="data-channels"></a>

 Los canales de datos le permiten comunicar de forma segura mensajes arbitrarios entre su aplicación Amazon GameLift Streams y el cliente web (el JavaScript código que se ejecuta en el navegador web del usuario final). Esto permite a los usuarios finales interactuar con la aplicación que Amazon GameLift Streams está transmitiendo a través del navegador web en el que están viendo la transmisión. 

Estos son algunos ejemplos de casos de uso de canales de datos en Amazon GameLift Streams:
+ Los usuarios pueden abrir URLs la aplicación en su navegador local.
+ Los usuarios pueden pasar el contenido del portapapeles de un lado a otro a la aplicación.
+ Los usuarios pueden cargar contenido desde su máquina local a la aplicación.
+ Los desarrolladores pueden implementar una interfaz de usuario en el navegador que envía comandos a la aplicación.
+ Los usuarios pueden pasar esquemas para controlar la visualización de las capas de visualización.

## Características
<a name="data-channels-features"></a>

**Límites de tamaño de los mensajes**  
El SDK web de Amazon GameLift Streams impone un límite de tamaño máximo de 64 KB (65536 bytes) por mensaje. Esto garantiza que los límites de tamaño de los mensajes sean compatibles con la mayoría de los navegadores y que la comunicación tenga un bajo impacto en el ancho de banda total de la transmisión.

**Métricas**  
 Las métricas sobre el uso de su canal de datos se envían a su cuenta de AWS cuando finaliza una sesión de transmisión. Para obtener más información, consulte [Canales de datos](monitoring-cloudwatch.md#monitoring-data-channels) la sección *Monitorización de Amazon GameLift Streams*. 

## Uso de canales de datos
<a name="data-channels-using"></a>

El SDK web de Amazon GameLift Streams proporciona la `sendApplicationMessage` función que envía un mensaje como una matriz de bytes a la aplicación. El mensaje se procesa mediante una función de devolución de llamada `clientConnection.applicationMessage` que usted defina.

Si el cliente envía mensajes antes de que la aplicación se conecte al puerto del canal de datos, los mensajes se ponen en cola. Luego, cuando la aplicación se conecta, recibe los mensajes. Sin embargo, si la aplicación envía mensajes antes de que el cliente se conecte al puerto del canal de datos, los mensajes se pierden. La aplicación debe comprobar el estado de conexión de los clientes antes de enviar un mensaje.

## Del lado del cliente
<a name="data-channels-using-client"></a>

Escribe el siguiente código en tu aplicación de cliente web.

1.  Defina la función de devolución de llamada para recibir los mensajes entrantes de la aplicación. 

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

1.  Configure su `clientConnection.applicationMessage` función de devolución de llamada. 

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

1.  Llama a la `GameLiftStreams.sendApplicationMessage` función para enviar mensajes a tu aplicación. Puedes realizar esta llamada en cualquier momento, siempre que la sesión de transmisión esté activa y la entrada esté conectada. 

Como ejemplo, consulte el cliente de ejemplo del SDK web de Amazon GameLift Streams, que muestra cómo configurar un canal de datos sencillo en el lado del cliente.

## Del lado de la aplicación
<a name="data-channels-using-application"></a>

Escribe la siguiente lógica en tu aplicación.

### Paso 1. Conéctese al puerto del canal de datos
<a name="data-channels-using-application-1"></a>

Cuando se inicie la aplicación, conéctese al puerto `40712` activado`localhost`. La aplicación debe mantener esta conexión durante toda la ejecución. Si la aplicación cierra la conexión, no se puede volver a abrir.

### Paso 2. Escuche los eventos
<a name="data-channels-using-application-2"></a>

Un evento comienza con un encabezado de tamaño fijo, seguido de datos asociados de longitud variable. Cuando su aplicación reciba un evento, analice el evento para recuperar la información.

**Formato de eventos**
+ **Encabezado**: un encabezado de 4 bytes en el formulario `abcc`
  +  `a`: byte de identificación de cliente. Identifica una conexión de cliente específica, en el caso de conexiones múltiples (debido a la desconexión y la reconexión).
  +  `b`: byte de tipo de evento. `0`- el cliente conectado, `1` - el cliente desconectado, `2` - se envía un mensaje desde el cliente. Es posible que se reciban otros tipos de eventos con futuras actualizaciones del servicio Amazon GameLift Streams y deben ignorarse.
  +  `cc`: Longitud de los datos del evento asociado. Se representa como 2 bytes con un orden alto (el primer byte es el más significativo). Si el tipo de evento es 2, los datos del evento representan el contenido del mensaje del cliente.
+ **Datos**: los bytes restantes contienen los datos del evento, como un mensaje del cliente. La longitud de los datos se indica `cc` en el encabezado.

**Para escuchar los eventos**

1. Lea los cuatro bytes del encabezado para recuperar el identificador del cliente, el tipo de evento y la longitud de los datos del evento.

1. Lea los datos del evento de longitud variable, independientemente del identificador del cliente y del tipo de evento, de acuerdo con la longitud descrita en el encabezado. Es importante leer los datos de forma incondicional para que los datos del evento nunca se queden en el búfer, donde podrían confundirse con el siguiente encabezado del evento. No hagas suposiciones sobre la longitud de los datos en función de los tipos de eventos.

1. Tome las medidas adecuadas en función del tipo de evento, si la aplicación lo reconoce. Esta acción puede incluir registrar una conexión entrante o una desconexión, o analizar el mensaje del cliente y activar la lógica de la aplicación.

### Paso 3. Transmite los mensajes al cliente
<a name="data-channels-using-application-3"></a>

La aplicación debe transmitir los mensajes con el mismo formato de encabezado de cuatro bytes que utilizan los eventos entrantes.

**Para transmitir un mensaje al cliente**

1. Escribe el encabezado con las siguientes propiedades:

   1. `a`: byte de identificación de cliente. Si el mensaje responde a un mensaje de un cliente, debería reutilizar el mismo identificador de cliente que el mensaje de cliente entrante, para evitar situaciones de concurrencia, como enviar una respuesta desde una conexión de cliente antigua a un cliente recién reconectado. Si tu aplicación envía un mensaje no solicitado al cliente, debe configurar el identificador del cliente para que coincida con el evento de «conexión del cliente» más reciente (tipo de evento 0).

   1. `b`: El tipo de evento de los mensajes salientes siempre debe ser 2. El cliente ignora los mensajes con otros tipos de eventos.

   1. `cc`: longitud del mensaje, en bytes.

1. Escribe los bytes del mensaje.

El mensaje se entrega al cliente especificado, a menos que el cliente se desconecte. Cuando un cliente desconectado se vuelve a conectar, se asigna un nuevo ID de cliente mediante un evento conectado al cliente. Se descartan todos los mensajes del ID de cliente anterior que no se hayan entregado.

**Example**  
El siguiente pseudocódigo demuestra la lógica para comunicar los mensajes en el lado de la aplicación. Para ver un ejemplo completo del uso de Winsock, consulte el código [completo del cliente de Winsock en la documentación de Windows Sockets 2](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)
```