

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Serviço de back-end e cliente web Amazon GameLift Streams
<a name="sdk"></a>

 O Amazon GameLift Streams permite que você transmita aplicativos por meio de um navegador da web. Com o Amazon GameLift Streams Web SDK, você pode configurar um serviço de streaming de back-end. Em seguida, os usuários finais se conectam a um stream por meio de um cliente web. Eles podem jogar seu jogo ou interagir com seu aplicativo em toda a nuvem. 

 O Amazon GameLift Streams Web SDK inclui uma amostra de servidor de back-end e uma amostra de cliente web, que você pode usar para começar a criar um serviço de back-end. Você também pode usar essas amostras para testar como o Amazon GameLift Streams é transmitido, sem desenvolvimento adicional. Para começar, consulte[Configurando um servidor web e um cliente com o Amazon GameLift Streams](setting-up-web-sdk.md). 

**Topics**
+ [Navegadores e entradas compatíveis](sdk-browsers-input.md)
+ [Portas necessárias](required-ports.md)
+ [Configurando um servidor web e um cliente com o Amazon GameLift Streams](setting-up-web-sdk.md)
+ [Personalize a aparência do stream](sdk-stream-appearance.md)
+ [Preferência de localidade](sdk-locale-support.md)
+ [Manuseio do movimento do mouse](sdk-mouse-movement.md)
+ [Comunicação por canal de dados entre um aplicativo e um cliente web](data-channels.md)

# Navegadores e entradas compatíveis
<a name="sdk-browsers-input"></a>

A seguir estão listadas as plataformas e os navegadores compatíveis para visualizar os streams do Amazon GameLift Streams e seus periféricos de entrada compatíveis. Os navegadores também devem ser compatíveis com a codificação avançada de vídeo (AVC), também conhecida como H.264.

No geral, recomendamos o Google Chrome, o Microsoft Edge ou um aplicativo de desktop personalizado baseado no Chromium para a melhor experiência do usuário final e máxima compatibilidade, especialmente com controladores de jogos.

 Para saber mais sobre quais controladores são compatíveis com quais navegadores, consulte a API do [Web Gamepad](https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API). Embora algumas orientações possam não se aplicar ao Amazon GameLift Streams, esperamos que a maioria dos controladores de jogos se conecte com sucesso via Bluetooth. 

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

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

A seguir estão os problemas conhecidos com navegadores e entradas:
+ O Safari sairá imediatamente da tela cheia sempre que `Esc` for pressionado. Isso não pode ser substituído.
+ Visualizações de navegador “incorporadas” ou “no aplicativo”, como aquelas em aplicativos móveis LinkedIn, como Yelp, Instagram e outros, não são suportadas no iOS. Eles tendem a desativar o suporte WebRTC do navegador necessário para streaming interativo em tempo real. Recomendamos detectar cadeias de caracteres de navegador não padrão e solicitar que o usuário abra no Safari.
+ Se a resolução da tela em seu aplicativo não estiver definida como 1080p, o rastreamento do mouse poderá ser afetado. Recomendamos desativar a seleção de qualquer outra resolução, se possível. Também recomendamos desativar o modo de janela e executá-lo somente em tela cheia.
+ Para oferecer suporte ao plug-and-play de controladores de jogos no Proton, apesar da falta de suporte para eles em aplicativos Linux nativos, os jogos executados em ambientes de execução do Proton sempre *mostrarão* um controlador de jogo conectado, mesmo que nenhum esteja conectado ao cliente. Isso pode ser um problema para jogos que solicitam a entrada do controle mesmo quando o controle está ocioso e sem uso. Recomendamos que os jogos mostrem a interface de entrada com base no último método de entrada.

## Limitações
<a name="sdk-browsers-input-limits"></a>
+ A maioria dos ambientes de execução oferece suporte a controladores de jogos, exceto o Ubuntu 22.04 LTS. Se você precisar de suporte para controle de jogo, considere criar o jogo usando outro ambiente de tempo de execução. Para obter uma lista de outros ambientes de tempo de execução, consulte[Ambientes de execução](configuration-options.md#configuration-options-runtime).
+ Os controles de jogo PlayStation 5 e Luna não são compatíveis com o Firefox.
+ Suporte de feedback tátil:
  + O feedback tátil nos S/X controladores PlayStation 4 e Xbox Series é compatível com Chrome, Edge e Safari.
  + O Haptics no DualSense controlador PlayStation 5 só é compatível com o navegador Safari.
  + O Firefox não suporta feedback tátil em nenhum controle.
  + Os dispositivos Android e iOS não suportam feedback tátil em nenhum controle.
+ O recurso **de stream de teste** no console do Amazon GameLift Streams não é compatível com microfones.

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

O streaming IPv6 somente para clientes é suportado somente com aplicativos de tempo de execução do Windows.


| Runtime | Transmitindo por IPv4 | Transmitindo por IPv6 | 
| --- | --- | --- | 
| Microsoft Windows Server 2022 Base | Sim | Sim | 
| Ubuntu 22.04 LTS | Sim | Não | 
| Tempos de execução do Proton | Sim | Não | 

# Portas necessárias
<a name="required-ports"></a>

 Para integrar o Amazon GameLift Streams, garanta que sua infraestrutura de rede tenha as portas necessárias abertas e acessíveis. A seguir está uma lista das portas que você deve planejar abrir na sua rede para se comunicar com o Amazon GameLift Streams. 


| Porta | Protocolo | Finalidade | 
| --- | --- | --- | 
|  443  |  (HTTPS) TCP  |  AWS APIs, incluindo Amazon GameLift Streams  | 
|  33435-33465  |  UDP  |  RTC na Web  | 

# Configurando um servidor web e um cliente com o Amazon GameLift Streams
<a name="setting-up-web-sdk"></a>

 Neste tutorial, você configurará um aplicativo cliente web que integra o serviço de streaming do Amazon GameLift Streams. Em seguida, você usará o Amazon GameLift Streams Web SDK, uma JavaScript biblioteca e um código de amostra com os quais você pode começar. O código de amostra inclui um servidor web de back-end simples do Amazon GameLift Streams e um cliente web simples. Ao final deste tutorial, você pode iniciar um stream usando o código de amostra. 

 Se é a primeira vez que você usa o Amazon GameLift Streams, é altamente recomendável começar com o [Iniciando sua primeira transmissão no Amazon GameLift Streams](streaming-process.md) tutorial, que orienta você a fazer o upload de um jogo para o Amazon S3 e testar a transmissão do mesmo a partir do console do GameLift Amazon Streams em seu navegador. 

## Pré-requisitos
<a name="setting-up-web-sdk-prereq"></a>
+ Uma conta da AWS com credenciais adequadas para acesso programático. Para obter mais informações, consulte [Configurando o Amazon GameLift Streams como desenvolvedor](setting-up.md).
+ O SDK da AWS.
+ Um navegador da web GameLift compatível com o Amazon Streams — consulte. [Navegadores e entradas compatíveis](sdk-browsers-input.md)
+ Node.js — consulte a página de [downloads do Node.js](https://nodejs.org/en/download).

## Baixe o Web SDK
<a name="setting-up-web-sdk-materials"></a>

Para este tutorial, você precisará baixar os seguintes materiais da seção Recursos da [página de introdução do produto](https://aws.amazon.com/gamelift/streams/getting-started/):
+ **Pacote Amazon GameLift Streams Web SDK**: inclui código de amostra para um serviço de back-end simples e um cliente web.
+ Referência da **API do Amazon GameLift Streams Web SDK: Essa referência** de API documenta os wrappers de API do Amazon GameLift Streams para. JavaScript

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

Você precisa ter recursos de stream — um aplicativo e um grupo de stream — para iniciar um stream. Especificamente, você deve ter:
+  Um aplicativo no status **Pronto**. 
+  Um grupo de streams em status **Ativo** com capacidade de stream disponível. 
+  Para streaming em locais diferentes do local principal, o aplicativo deve ter concluído a replicação para esse local. 

 Para configurar um aplicativo e um grupo de streams usando o console do Amazon GameLift Streams ou a GameLift CLI do Amazon Streams, consulte e, respectivamente. [Prepare um aplicativo no Amazon GameLift Streams](applications.md) [Gerencie o streaming com um grupo de GameLift streams do Amazon Streams](stream-groups.md) Como alternativa, para ver um end-to-end passo a passo no console do Amazon GameLift Streams, consulte. [Iniciando sua primeira transmissão no Amazon GameLift Streams](streaming-process.md) 

## Configurar um servidor de back-end
<a name="setting-up-web-sdk-backend"></a>

 O servidor de back-end é responsável por lidar com tarefas como autenticar usuários, configurar parâmetros de stream e realizar chamadas de API do serviço Amazon GameLift Streams em nome dos usuários finais. Analise o código de amostra e a referência da API Amazon GameLift Streams Web SDK para saber mais sobre como configurar isso. Especificamente, consulte o arquivo server.js no pacote Amazon GameLift Streams Web SDK. 

**Importante**  
 Esse código é um exemplo de código apenas para fins de teste e avaliação e não deve ser usado em uma capacidade de produção. 

**Para executar o serviço de back-end de amostra**

1.  Abra um terminal ou prompt de comando e navegue até a pasta`AmazonGameLiftStreamsWebSDK\GameLiftStreamsSampleGamePublisherService\`. 

1.  Execute os seguintes comandos : 

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

 Com o exemplo de serviço de back-end em execução, os usuários finais podem se conectar a um stream por meio do cliente web. Teste o cliente web na próxima etapa. 

## Inicie um cliente web
<a name="setting-up-web-sdk-client"></a>

O aplicativo cliente web é responsável por receber e decodificar os streams do Amazon GameLift Streams, transmitir para os usuários finais e fornecer a interface do usuário do navegador da web para que os usuários finais interajam com o aplicativo. Analise o código de amostra e a referência da API do Amazon GameLift Streams Web SDK para saber mais sobre como integrar o JavaScript Amazon GameLift Streams Web SDK em seu próprio aplicativo cliente web. Especificamente, veja `public/index.html` no pacote Amazon GameLift Streams Web SDK. Você também pode ver a fonte da página da Web ao iniciar um cliente Web em seu navegador.

**nota**  
O tempo de execução do Windows no Amazon GameLift Streams oferece suporte a sessões de streaming por IPv4 ou IPv6. No entanto, os ambientes de execução Linux e Proton oferecem suporte apenas ao streaming. IPv4

**Para iniciar um aplicativo cliente web**

1.  Abra um navegador da web e navegue até`http://localhost:port/`. O número da porta é definido pelo servidor de back-end; por padrão, essa é a porta HTTP 8000. 

1. Jogue o jogo ou use o software.

   1. Para anexar uma entrada, como o mouse, escolha **Anexar entrada**.

   1. Para sair do jogo, escolha a tecla **Esc**.

   1. Para interromper o processo do servidor, escolha a tecla **Ctrl\$1C**.

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

**Atenção**  
 Um grupo de streams incorre em custos quando tem capacidade de streaming alocada, mesmo que essa capacidade não seja usada. Para evitar custos desnecessários, escale seus grupos de streaming para o tamanho necessário. Durante o desenvolvimento, sugerimos que você escale a capacidade sempre ativa e a capacidade ociosa de destino em seus grupos de stream para zero quando não estiverem em uso. Para obter mais informações, consulte [Dimensione grupos de stream para capacidade zero](pricing.md#pricing-pause-stream-groups).

Depois de concluir o tutorial e não precisar mais transmitir seu aplicativo, siga estas etapas para limpar seus recursos do Amazon GameLift Streams.

**Excluindo um grupo de streams**

 Quando você exclui um grupo de streams, o Amazon GameLift Streams trabalha para liberar toda a capacidade de streaming. 

**Para excluir um grupo de streams usando o console do Amazon GameLift Streams**

1.  Faça login no Console de gerenciamento da AWS e abra o [console do Amazon GameLift Streams](https://console.aws.amazon.com/gameliftstreams/). 

1.  Para ver uma lista dos seus grupos de stream existentes, no painel de navegação, escolha **Stream groups**. 

1.  Escolha o nome do grupo de stream que você deseja excluir. 

1.  Na página de detalhes do grupo de transmissão, escolha **Excluir**. 

1.  Na caixa de diálogo **Excluir**, confirme a ação de exclusão. 

 O Amazon GameLift Streams começa a liberar recursos computacionais e a excluir o grupo de streams. Durante esse período, o grupo de stream está no status **Excluindo**. Depois que o Amazon GameLift Streams excluir o grupo de streams, você não poderá mais recuperá-lo. 

**Excluindo um aplicativo**

 É possível excluir apenas uma aplicação que atenda às seguintes condições: 
+  A aplicação está no estado **Pronto** ou **Erro**. 
+  Não está sendo realizado o streaming de uma aplicação em nenhuma sessão de streaming em andamento. Você deve esperar até que o cliente encerre a sessão de stream ou chamar [TerminateStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_TerminateStreamSession.html)a API do Amazon GameLift Streams para finalizar o stream. 

 Se a aplicação estiver vinculada a qualquer grupo de transmissões, você deverá primeiro desvinculá-la de todos os grupos de transmissões associados para poder excluí-la. No console, uma caixa de diálogo conduzirá você por esse processo. 

**Para excluir um aplicativo usando o console do Amazon GameLift Streams**

1. Faça login no Console de gerenciamento da AWS e abra o [console do Amazon GameLift Streams](https://console.aws.amazon.com/gameliftstreams/).

1. Na barra de navegação, escolha **Aplicativos** para ver uma lista dos aplicativos existentes. Escolha o aplicativo que você deseja excluir. 

1. Na página de detalhes do aplicativo, escolha **Excluir**. 

1. Na caixa de diálogo **Excluir**, confirme a ação de exclusão. 

 O Amazon GameLift Streams começa a excluir o aplicativo. Durante esse período, o aplicativo está em `Deleting` status. Depois que o Amazon GameLift Streams excluir o aplicativo, você não poderá mais recuperá-lo. 

# Personalize a aparência do stream
<a name="sdk-stream-appearance"></a>

## Tela de carregamento
<a name="sdk-loading-screen"></a>

Quando um cliente abre um navegador da web para ver um stream, o cliente web começa a estabelecer uma conexão com a sessão de stream do Amazon GameLift Streams. Enquanto a sessão de transmissão é carregada, você pode exibir um plano de fundo e um logotipo personalizados na tela do cliente.

O cliente de amostra do Amazon GameLift Streams Web SDK, no `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/loadingscreen.js` arquivo, demonstra como você pode implementar um logotipo animado em seu cliente web front-end. A tela de carregamento padrão consiste em 2 imagens: plano de fundo e primeiro plano. A imagem em primeiro plano é posicionada no meio e tem uma animação de pulso. A animação é reproduzida somente enquanto a sessão de transmissão está se conectando.

**Para ativar uma tela de carregamento**

1. No cliente de amostra do Amazon GameLift Streams Web SDK, navegue até a `GameLiftStreamsSampleGamePublisherService/public/LoadingScreen/` pasta.

1. Adicione suas imagens de fundo e primeiro plano usando os nomes padrão, e. `Background.png` `LoadingLogo.png` Se quiser renomeá-los ou usar um formato de imagem diferente, você deve atualizar o código em`GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js`.

1. (Opcional) Em`GameLiftStreamsSampleGamePublisherService/public/loadingscreen.js`, atualize o JavaScript código para implementar animações diferentes.

# Preferência de localidade
<a name="sdk-locale-support"></a>

 No Amazon GameLift Streams, você pode definir a preferência de localidade por stream. Isso é útil se seu aplicativo recupera informações específicas do local do sistema operacional do usuário final, como hora ou moeda. 

 O Amazon GameLift Streams oferece suporte aos seguintes idiomas: 


| Valor | Description | 
| --- | --- | 
|  `en_US`  |  Inglês dos EUA (padrão)  | 
|  `ja_jp.UTF-8`  |  Japonesa  | 

 **Para alterar a configuração de localidade** 

 Ao ligar [StartStreamSession](https://docs.aws.amazon.com/gameliftstreams/latest/apireference/API_StartStreamSession.html)usando a API do Amazon GameLift Streams, adicione `LANG=<language>` à sua`AdditionalEnvironmentVariables`. Como a preferência de localidade é exclusiva por usuário, você define isso no nível da sessão de streaming. Se você não definir isso, o stream usará inglês americano por padrão. 

**Example Exemplo**  

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

# Manuseio do movimento do mouse
<a name="sdk-mouse-movement"></a>

O manuseio do movimento do mouse é fundamental para oferecer experiências de usuário responsivas e intuitivas em aplicativos transmitidos. O Amazon GameLift Streams otimiza automaticamente a transmissão de entrada do mouse com base no comportamento do cursor do seu aplicativo, garantindo que os movimentos do mouse pareçam naturais, independentemente de o cursor estar oculto ou visível. Entender como o Amazon GameLift Streams processa eventos de mouse ajuda você a criar aplicativos que funcionem perfeitamente com o serviço de streaming e forneçam a melhor experiência possível ao usuário.

## Modos de entrada do mouse
<a name="sdk-mouse-input-modes"></a>

O Amazon GameLift Streams usa dois modos distintos para transmitir eventos do mouse para seu aplicativo, selecionando automaticamente o modo apropriado com base na visibilidade do cursor:

Modo relativo  
No modo relativo, as atualizações do mouse são transmitidas como pequenas diferenças incrementais em relação à posição anterior. Esse modo é ideal para aplicativos que exigem rastreamento preciso e contínuo do movimento do mouse, como jogos de tiro em primeira pessoa (FPS) ou interfaces que usam orientação 3D. O Amazon GameLift Streams usa o modo relativo quando o cursor do sistema operacional está oculto ou totalmente transparente.

Modo absoluto  
No modo absoluto, a posição do cursor do mouse é transmitida como uma coordenada exata da tela. Esse modo funciona bem para aplicativos que dependem do posicionamento preciso do cursor, como point-and-click jogos ou qualquer interface de usuário com elementos clicáveis. O Amazon GameLift Streams usa o modo absoluto quando o cursor do sistema operacional está visível, mesmo que seu aplicativo exiba uma imagem personalizada do cursor.

Essa seleção automática garante o desempenho ideal para diferentes tipos de aplicativos sem exigir configuração manual.

## Bloqueio de ponteiro
<a name="sdk-pointer-lock"></a>

O bloqueio de ponteiro é um recurso da API da web que captura o cursor do mouse dentro de um elemento específico, ocultando o cursor e impedindo que ele saia da área designada. Esse recurso é particularmente valioso para jogos que exigem movimentos irrestritos do mouse para controlar ou mirar a câmera, sem a distração de um cursor visível ou a limitação de alcançar as bordas da janela.

O Amazon GameLift Streams fornece a funcionalidade de bloqueio automático de ponteiro por meio da `autoPointerLock` propriedade na interface do Web SDK. `InputConfiguration` Esse recurso se integra à [requestPointerLock API para fornecer captura](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestPointerLock) de mouse intuitiva e sensível ao contexto.

### Comportamento automático do bloqueio do ponteiro
<a name="sdk-pointer-lock-behavior"></a>

O Amazon GameLift Streams ativa automaticamente o bloqueio por ponteiro quando o aplicativo está em tela cheia e o cursor remoto está invisível no host do stream. Esse comportamento se alinha bem aos padrões comuns de desenvolvimento de jogos:
+ **Jogos FPS/TPS e controle de orientação 3D** - O ponteiro é bloqueado automaticamente e o cursor fica oculto, fornecendo controle de câmera irrestrito, essencial para a jogabilidade de FPS.
+ **Point-and-click jogos e controle da interface** do usuário - Quando os jogos tornam o cursor visível para interações de menu ou jogabilidade de estratégia, o ponteiro permanece visível e desbloqueado, preservando a experiência pretendida do usuário.

### Opções de configuração
<a name="sdk-pointer-lock-configuration"></a>

A `autoPointerLock` propriedade aceita os seguintes valores:

`true`  
O mouse é sempre capturado quando o cursor remoto está invisível.

`false`  
O mouse nunca é capturado, independentemente da visibilidade do cursor.

`'fullscreen'` (padrão)  
O mouse só é capturado quando o elemento de vídeo está no modo de tela cheia e o cursor remoto está invisível.

**Importante**  
`autoPointerLock`não tem efeito no navegador Safari ou nas plataformas iOS devido às limitações da plataforma.

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

Para garantir o manuseio ideal do mouse em seus aplicativos transmitidos:
+ **Sempre transmita em tela cheia** - Seu aplicativo já deve estar em execução no modo de tela cheia para funcionar corretamente em nosso serviço. Além disso, recomendamos usar o suporte do navegador para tornar o stream um elemento de tela cheia para a melhor experiência do usuário final. Isso ajudará a evitar problemas como problemas de alinhamento entre o cursor do sistema e o cursor do software.
+ **Oculte o cursor para movimento relativo** - Se o aplicativo espera um movimento relativo do mouse (como controles de câmera no estilo FPS ou interações baseadas em arrasto), oculte o cursor do sistema operacional durante essas interações. Em alguns cenários, talvez seja necessário ocultar o cursor com o mouse para baixo e mostrá-lo novamente com o mouse para cima.
+ **Mostrar o cursor para posicionamento absoluto** - Quando seu aplicativo precisar de um posicionamento preciso do cursor para interações com a interface do usuário, certifique-se de que o cursor do sistema operacional permaneça visível para ativar o modo de coordenadas absolutas.
+ **Teste diferentes cenários de entrada** - Verifique se seu aplicativo manipula corretamente os modos de mouse relativo e absoluto, pois o Amazon GameLift Streams pode alternar entre os modos com base nas alterações de visibilidade do cursor.
+ **Teste diferentes modos de janela** - Teste o manuseio do mouse do seu aplicativo nos modos de janela e tela cheia, se aplicável. Determine qual `autoPointerLock` configuração é melhor para sua configuração de entrada.

# Comunicação por canal de dados entre um aplicativo e um cliente web
<a name="data-channels"></a>

 Os canais de dados permitem que você comunique com segurança mensagens arbitrárias entre seu aplicativo Amazon GameLift Streams e o cliente web (o JavaScript código executado no navegador do usuário final). Isso permite que os usuários finais interajam com o aplicativo que o Amazon GameLift Streams está transmitindo, por meio do navegador da web em que estão visualizando o stream. 

Aqui estão alguns exemplos de casos de uso de canais de dados no Amazon GameLift Streams:
+ Os usuários podem abrir URLs o aplicativo em seu navegador local.
+ Os usuários podem passar o conteúdo da área de transferência para o aplicativo.
+ Os usuários podem carregar conteúdo de sua máquina local para o aplicativo.
+ Os desenvolvedores podem implementar a interface do usuário no navegador que envia comandos para o aplicativo.
+ Os usuários podem passar esquemas para controlar a exibição das camadas de visualização.

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

**Limites de tamanho de mensagem**  
O Amazon GameLift Streams Web SDK impõe um limite máximo de tamanho de 64 KB (65536 bytes) por mensagem. Isso garante que os limites de tamanho da mensagem sejam compatíveis com a maioria dos navegadores e que a comunicação tenha baixo impacto na largura de banda total do stream.

**Métricas**  
 As métricas sobre o uso do seu canal de dados são enviadas para sua conta da AWS quando uma sessão de stream termina. Para obter mais informações, consulte a [Canais de dados](monitoring-cloudwatch.md#monitoring-data-channels) seção *Monitoramento do Amazon GameLift Streams*. 

## Usando canais de dados
<a name="data-channels-using"></a>

O Amazon GameLift Streams Web SDK fornece a `sendApplicationMessage` função que envia uma mensagem como uma matriz de bytes para o aplicativo. A mensagem é processada por uma função de retorno de chamada, `clientConnection.applicationMessage` que você define.

Se o cliente enviar mensagens antes que o aplicativo se conecte à porta do canal de dados, as mensagens serão enfileiradas. Então, quando o aplicativo se conecta, ele recebe as mensagens. No entanto, se o aplicativo enviar mensagens antes que o cliente se conecte à porta do canal de dados, as mensagens serão perdidas. O aplicativo deve verificar o estado da conexão dos clientes antes de enviar uma mensagem.

## No lado do cliente
<a name="data-channels-using-client"></a>

Escreva o código a seguir em seu aplicativo cliente web.

1.  Defina a função de retorno de chamada para receber mensagens do aplicativo. 

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

1.  `clientConnection.applicationMessage`Defina sua função de retorno de chamada. 

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

1.  Chame a `GameLiftStreams.sendApplicationMessage` função para enviar mensagens para seu aplicativo. Você pode chamar isso a qualquer momento, desde que a sessão de transmissão esteja ativa e a entrada esteja anexada. 

Como exemplo, consulte o cliente de amostra do Amazon GameLift Streams Web SDK, que demonstra como configurar um canal de dados simples no lado do cliente.

## No lado do aplicativo
<a name="data-channels-using-application"></a>

Escreva a seguinte lógica em seu aplicativo.

### Etapa 1. Conecte-se à porta do canal de dados
<a name="data-channels-using-application-1"></a>

Quando seu aplicativo for iniciado, conecte-se à porta `40712` ativada`localhost`. Seu aplicativo deve manter essa conexão durante toda a execução. Se o aplicativo fechar a conexão, ela não poderá ser reaberta.

### Etapa 2. Ouça os eventos
<a name="data-channels-using-application-2"></a>

Um evento começa com um cabeçalho de tamanho fixo, seguido por dados associados de tamanho variável. Quando seu aplicativo recebe um evento, analise o evento para recuperar as informações.

**Event format**
+ **Cabeçalho**: um cabeçalho de 4 bytes no formulário `abcc`
  +  `a`: byte de identificação do cliente. Isso identifica uma conexão de cliente específica, no caso de várias conexões (devido à desconexão e reconexão).
  +  `b`: byte do tipo de evento. `0`- o cliente conectado, `1` - o cliente desconectado, `2` - uma mensagem é enviada pelo cliente. Outros tipos de eventos podem ser recebidos com futuras atualizações do serviço Amazon GameLift Streams e devem ser ignorados.
  +  `cc`: tamanho dos dados do evento associado. Isso é representado como 2 bytes com ordenação big-endian (o primeiro byte é o mais significativo). Se o tipo de evento for 2, os dados do evento representarão o conteúdo da mensagem do cliente.
+ **Dados**: os bytes restantes contêm os dados do evento, como uma mensagem do cliente. O comprimento dos dados é indicado `cc` no cabeçalho.

**Para ouvir os eventos**

1. Leia os quatro bytes do cabeçalho para recuperar o ID do cliente, o tipo de evento e o tamanho dos dados do evento.

1. Leia os dados do evento de tamanho variável, independentemente do ID do cliente e do tipo de evento, de acordo com o tamanho descrito no cabeçalho. É importante ler os dados incondicionalmente para que os dados do evento nunca sejam deixados no buffer, onde possam ser confundidos com o próximo cabeçalho do evento. Não faça suposições sobre o tamanho dos dados com base nos tipos de eventos.

1. Tome as medidas apropriadas com base no tipo de evento, se reconhecido pelo seu aplicativo. Essa ação pode incluir registrar uma conexão ou desconexão de entrada ou analisar a mensagem do cliente e acionar a lógica do aplicativo.

### Etapa 3. Transmita mensagens para o cliente
<a name="data-channels-using-application-3"></a>

O aplicativo deve transmitir mensagens com o mesmo formato de cabeçalho de quatro bytes usado pelos eventos recebidos.

**Para transmitir uma mensagem ao cliente**

1. Escreva o cabeçalho com as seguintes propriedades:

   1. `a`: byte de identificação do cliente. Se sua mensagem for em resposta a uma mensagem do cliente, ela deverá reutilizar o mesmo ID do cliente que a mensagem recebida do cliente, para evitar condições de disputa, como entregar uma resposta de uma conexão antiga do cliente para um cliente recém-reconectado. Se seu aplicativo estiver enviando uma mensagem não solicitada ao cliente, ele deverá definir o ID do cliente para corresponder ao evento de “conexão do cliente” mais recente (evento tipo 0).

   1. `b`: O tipo de evento das mensagens enviadas deve ser sempre 2. O cliente ignora mensagens com outros tipos de eventos.

   1. `cc`: tamanho da mensagem, em bytes.

1. Escreva os bytes da mensagem.

A mensagem é entregue ao cliente especificado, a menos que o cliente se desconecte. Quando um cliente desconectado se reconecta, uma nova ID de cliente é atribuída por meio de um evento conectado ao cliente. Todas as mensagens não entregues para o ID do cliente antigo são descartadas.

**Example**  
O pseudocódigo a seguir demonstra a lógica para comunicar mensagens no lado do aplicativo. Para obter um exemplo completo do uso do Winsock, consulte [Código completo do cliente Winsock](https://learn.microsoft.com/en-us/windows/win32/winsock/complete-client-code) na documentação do Windows Sockets 2.  

```
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)
```