<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos chat em tempo real html - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/chat-em-tempo-real-html/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/chat-em-tempo-real-html/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Wed, 21 Oct 2026 04:49:29 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Arquivos chat em tempo real html - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/chat-em-tempo-real-html/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML5 WebSockets: Guia de Comunicação Real &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-html/websockets-comunicacao-tempo-real/</link>
					<comments>https://webzoneware.com/web-academy/curso-html/websockets-comunicacao-tempo-real/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 04:49:29 +0000</pubDate>
				<category><![CDATA[Curso de HTML & HTML5]]></category>
		<category><![CDATA[chat em tempo real html]]></category>
		<category><![CDATA[comunicacao bidirecional html5]]></category>
		<category><![CDATA[html5 websockets]]></category>
		<category><![CDATA[protocolo wss]]></category>
		<category><![CDATA[websocket javascript]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29356</guid>

					<description><![CDATA[<p>Enquanto o modelo HTTP clássico opera sob o ciclo de solicitação e resposta e os Server-Sent Events (SSE) transmitem dados exclusivamente do servidor para o cliente, o HTML5 WebSockets estabelece o ápice da interatividade na internet: um canal de comunicação totalmente bidirecional e full-duplex sobre uma única conexão TCP persistente. Com WebSockets, tanto o navegador [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/websockets-comunicacao-tempo-real/">HTML5 WebSockets: Guia de Comunicação Real | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Enquanto o modelo HTTP clássico opera sob o ciclo de solicitação e resposta e os Server-Sent Events (SSE) transmitem dados exclusivamente do servidor para o cliente, o <strong>HTML5 WebSockets</strong> estabelece o ápice da interatividade na internet: um canal de comunicação <strong>totalmente bidirecional e full-duplex sobre uma única conexão TCP persistente</strong>. Com WebSockets, tanto o navegador quanto o servidor podem emitir e receber pacotes de dados de forma assíncrona a qualquer instante, com latência na casa dos milissegundos e sobrecarga quase nula de cabeçalhos.
</p>
<h2>1. A Revolução do Full-Duplex: Como o WebSocket Funciona</h2>
<p>
    Para compreender o salto arquitetural proporcionado pelos WebSockets, compare os três modelos de comunicação web:
</p>
<ul>
<li><strong>HTTP Tradicional (Half-Duplex com Fechamento):</strong> Como enviar cartas pelo correio. Você envia uma requisição, o servidor processa, responde e a conexão é encerrada.</li>
<li><strong>Server-Sent Events (Unidirecional Contínuo):</strong> Como ouvir uma estação de rádio. O servidor transmite informações continuamente, mas o cliente não pode responder pelo mesmo canal.</li>
<li><strong>WebSockets (Full-Duplex Simultâneo):</strong> Como uma ligação telefônica moderna. Ambas as partes estão com o canal aberto continuamente e podem falar e ouvir exatamente ao mesmo tempo, sem interrupções.</li>
</ul>
<h2>2. O Handshake de Atualização (HTTP Upgrade)</h2>
<p>
    Uma conexão WebSocket não começa no vácuo; ela nasce a partir de uma requisição HTTP/1.1 ou HTTP/2 comum que solicita a troca de protocolo (<em>handshake</em>):
</p>
    <div class="wzw-ide-card" id="wzw-code-87775" data-lang="http">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CODE</span>
                                <span class="wzw-ide-lines-count">13 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-87775', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-87775', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">&lt;!-- 1. O Navegador envia o pedido de Upgrade --&gt;</span></span>
<span class="wzw-code-line">GET /chat HTTP/<span class="wzw-tk-num">1.1</span></span>
<span class="wzw-code-line">Host: api.seusite.com</span>
<span class="wzw-code-line">Upgrade: websocket</span>
<span class="wzw-code-line">Connection: Upgrade</span>
<span class="wzw-code-line">Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==</span>
<span class="wzw-code-line">Sec-WebSocket-Version: <span class="wzw-tk-num">13</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">&lt;!-- 2. O Servidor aceita e comuta o protocolo --&gt;</span></span>
<span class="wzw-code-line">HTTP/<span class="wzw-tk-num">1.1</span> <span class="wzw-tk-num">101</span> Switching Protocols</span>
<span class="wzw-code-line">Upgrade: websocket</span>
<span class="wzw-code-line">Connection: Upgrade</span>
<span class="wzw-code-line">Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!-- 1. O Navegador envia o pedido de Upgrade --&gt;
GET /chat HTTP/1.1
Host: api.seusite.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

&lt;!-- 2. O Servidor aceita e comuta o protocolo --&gt;
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=</textarea>
        </div>
    </div>
    
<p>
    Após o status <code>101 Switching Protocols</code>, a conexão deixa de seguir o formato HTTP. A partir desse milissegundo, trafegam-se <strong>frames binários compactos</strong> de apenas 2 a 10 bytes de cabeçalho (contra milhares de bytes repetitivos de cookies e headers do HTTP comum!).
</p>
<div class="wzw-pro-tip">
<h4>🔒 Protocolo Seguro Obrigatório: Prefira Sempre WSS://</h4>
<p>
        Assim como usamos HTTPS para páginas seguras, conexões WebSocket devem utilizar o protocolo <strong><code>wss://</code></strong> (WebSocket Secure com criptografia TLS) em vez de <code>ws://</code> não encriptado.
    </p>
<p>
        Além de proteger os dados contra interceptações (ataques Man-in-the-Middle), o tráfego <code>wss://</code> atravessa portas seguras (443), impedindo que proxies e firewalls corporativos descartem os pacotes por engano.
    </p>
</div>
<h2>3. A API WebSocket no Navegador</h2>
<p>
    No front-end, a instânciação e a gerência do ciclo de vida da conexão são controladas pela classe nativa <code>WebSocket</code>:
</p>
<div class="wzw-table-responsive">
<table class="wzw-tech-table">
<thead>
<tr>
<th>Propriedade / Método</th>
<th>Tipo</th>
<th>Finalidade</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>new WebSocket(url)</code></td>
<td>Construtor</td>
<td>Inicia o handshake e abre o socket na URL indicada (<code>wss://...</code>).</td>
</tr>
<tr>
<td><code>socket.readyState</code></td>
<td>Propriedade (0 a 3)</td>
<td>Indica o estado: 0 (CONNECTING), 1 (OPEN), 2 (CLOSING), 3 (CLOSED).</td>
</tr>
<tr>
<td><code>socket.onopen</code></td>
<td>Evento</td>
<td>Disparado quando o handshake é finalizado e o socket está pronto para trafegar dados.</td>
</tr>
<tr>
<td><code>socket.onmessage</code></td>
<td>Evento</td>
<td>Disparado sempre que uma nova mensagem (texto UTF-8 ou binário) chega do servidor.</td>
</tr>
<tr>
<td><code>socket.send(dados)</code></td>
<td>Método</td>
<td>Transmite uma string de texto, JSON serializado ou dados binários (Blob/ArrayBuffer).</td>
</tr>
<tr>
<td><code>socket.close(codigo, motivo)</code></td>
<td>Método</td>
<td>Fecha voluntariamente a conexão de forma limpa.</td>
</tr>
</tbody>
</table>
</div>
<h2>4. Código Prático Completo: Chat Interativo em Tempo Real</h2>
<p>
    Abaixo implementamos uma interface de bate-papo com envio via teclado ou botão, balões diferenciados para mensagens próprias e de terceiros, e feedback visual do estado de conexão:
</p>
    <div class="wzw-ide-card" id="wzw-code-27182" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">20 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-27182', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-27182', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;wzw-chat-box&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;chat-header&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;h3&gt;</span>💬 Sala de Bate-Papo (WebSocket)<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;chatStatus&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-offline&quot;</span><span class="wzw-tk-tag">&gt;</span>Desconectado<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Painel onde as mensagens aparecem em cascata --&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;chatMessages&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;chat-messages&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Formulário de Envio --&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;form</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;chatForm&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;chat-input-area&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        &lt;input </span>
<span class="wzw-code-line">            type=&quot;text&quot; </span>
<span class="wzw-code-line">            id=&quot;msgInput&quot; </span>
<span class="wzw-code-line">            placeholder=&quot;Digite sua mensagem e pressione Enter...&quot; </span>
<span class="wzw-code-line">            autocomplete=&quot;off&quot; </span>
<span class="wzw-code-line">            required&gt;</span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">type</span>=<span class="wzw-tk-str">&quot;submit&quot;</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;btnEnviar&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-send&quot;</span><span class="wzw-tk-tag">&gt;</span>Enviar<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/form&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;wzw-chat-box&quot;&gt;
    &lt;div class=&quot;chat-header&quot;&gt;
        &lt;h3&gt;💬 Sala de Bate-Papo (WebSocket)&lt;/h3&gt;
        &lt;span id=&quot;chatStatus&quot; class=&quot;status-offline&quot;&gt;Desconectado&lt;/span&gt;
    &lt;/div&gt;

    &lt;!-- Painel onde as mensagens aparecem em cascata --&gt;
    &lt;div id=&quot;chatMessages&quot; class=&quot;chat-messages&quot;&gt;&lt;/div&gt;

    &lt;!-- Formulário de Envio --&gt;
    &lt;form id=&quot;chatForm&quot; class=&quot;chat-input-area&quot;&gt;
        &lt;input 
            type=&quot;text&quot; 
            id=&quot;msgInput&quot; 
            placeholder=&quot;Digite sua mensagem e pressione Enter...&quot; 
            autocomplete=&quot;off&quot; 
            required&gt;
        &lt;button type=&quot;submit&quot; id=&quot;btnEnviar&quot; class=&quot;btn-send&quot;&gt;Enviar&lt;/button&gt;
    &lt;/form&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-87045" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">85 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-87045', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-87045', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.wzw-chat-box {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">max-width</span>: <span class="wzw-tk-num">580px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.chat-header {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">justify-content</span>: space-between;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">16px</span> <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-bottom</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.status-online { color: <span class="wzw-tk-num">#10b981</span>; font-weight: bold; font-size: <span class="wzw-tk-num">0.85rem</span>; }</span>
<span class="wzw-code-line">.status-offline { color: <span class="wzw-tk-num">#ef4444</span>; font-weight: bold; font-size: <span class="wzw-tk-num">0.85rem</span>; }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.chat-messages {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">320px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">16px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">overflow-y</span>: auto;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#0b1120</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Balões de Conversa */</span></span>
<span class="wzw-code-line">.msg-bubble {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">max-width</span>: 75%;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">14px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.95rem</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">line-height</span>: 1.4;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.msg-me {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">align-self</span>: flex-end;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#2563eb</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#ffffff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-bottom-right-radius</span>: <span class="wzw-tk-num">2px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.msg-other {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">align-self</span>: flex-start;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f1f5f9</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-bottom-left-radius</span>: <span class="wzw-tk-num">2px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.chat-input-area {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.chat-input-area input {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">flex</span>: 1;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">14px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#fff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">outline</span>: none;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.chat-input-area input<span class="wzw-tk-kw">:focus</span> {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-send {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">18px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#10b981</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#fff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: none;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-weight</span>: 600;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.wzw-chat-box {
    max-width: 580px;
    background-color: #0f172a;
    border: 1px solid #1e293b;
    border-radius: 8px;
    overflow: hidden;
    color: #f8fafc;
}

.chat-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 16px 20px;
    background-color: #1e293b;
    border-bottom: 1px solid #334155;
}

.status-online { color: #10b981; font-weight: bold; font-size: 0.85rem; }
.status-offline { color: #ef4444; font-weight: bold; font-size: 0.85rem; }

.chat-messages {
    height: 320px;
    padding: 16px;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 10px;
    background-color: #0b1120;
}

/* Balões de Conversa */
.msg-bubble {
    max-width: 75%;
    padding: 10px 14px;
    border-radius: 8px;
    font-size: 0.95rem;
    line-height: 1.4;
}

.msg-me {
    align-self: flex-end;
    background-color: #2563eb;
    color: #ffffff;
    border-bottom-right-radius: 2px;
}

.msg-other {
    align-self: flex-start;
    background-color: #1e293b;
    color: #f1f5f9;
    border: 1px solid #334155;
    border-bottom-left-radius: 2px;
}

.chat-input-area {
    display: flex;
    padding: 12px;
    background-color: #1e293b;
    gap: 8px;
}

.chat-input-area input {
    flex: 1;
    padding: 10px 14px;
    background-color: #0f172a;
    border: 1px solid #334155;
    border-radius: 6px;
    color: #fff;
    outline: none;
}

.chat-input-area input:focus {
    border-color: #38bdf8;
}

.btn-send {
    padding: 10px 18px;
    background-color: #10b981;
    color: #fff;
    border: none;
    border-radius: 6px;
    cursor: pointer;
    font-weight: 600;
}</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-82854" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">50 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-82854', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-82854', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// Código JavaScript do Chat</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> statusEl = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;chatStatus&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> messagesEl = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;chatMessages&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> formEl = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;chatForm&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> inputEl = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;msgInput&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 1. Conexão ao servidor de Echo público para demonstração imediata</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// (Em produção, aponte para: &#039;wss://seu-servidor.com/ws&#039;)</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> socket = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">WebSocket</span>(<span class="wzw-tk-str">&#039;wss://echo.websocket.events&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 2. Quando a conexão é confirmada</span></span>
<span class="wzw-code-line">socket.onopen = () =&gt; {</span>
<span class="wzw-code-line">    statusEl.className = <span class="wzw-tk-str">&#039;status-online&#039;</span>;</span>
<span class="wzw-code-line">    statusEl.textContent = <span class="wzw-tk-str">&#039;● Conectado (Full-Duplex)&#039;</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-fn">adicionarMensagem</span>(<span class="wzw-tk-str">&#039;Sistema&#039;</span>, <span class="wzw-tk-str">&#039;Conectado à sala em tempo real!&#039;</span>, <span class="wzw-tk-str">&#039;msg-other&#039;</span>);</span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 3. Recebimento de mensagens vindas do servidor</span></span>
<span class="wzw-code-line">socket.onmessage = (event) =&gt; {</span>
<span class="wzw-code-line">    <span class="wzw-tk-fn">adicionarMensagem</span>(<span class="wzw-tk-str">&#039;Servidor Echo&#039;</span>, event.data, <span class="wzw-tk-str">&#039;msg-other&#039;</span>);</span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 4. Tratamento de encerramento de conexão</span></span>
<span class="wzw-code-line">socket.onclose = () =&gt; {</span>
<span class="wzw-code-line">    statusEl.className = <span class="wzw-tk-str">&#039;status-offline&#039;</span>;</span>
<span class="wzw-code-line">    statusEl.textContent = <span class="wzw-tk-str">&#039;○ Conexão Encerrada&#039;</span>;</span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 5. Envio de mensagem pelo usuário</span></span>
<span class="wzw-code-line">formEl.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;submit&#039;</span>, (e) =&gt; {</span>
<span class="wzw-code-line">    e.<span class="wzw-tk-fn">preventDefault</span>();</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> texto = inputEl.value.<span class="wzw-tk-fn">trim</span>();</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">if</span> (texto &amp;&amp; socket.readyState === WebSocket.OPEN) {</span>
<span class="wzw-code-line">        <span class="wzw-tk-comment">// Envia o dado pelo canal TCP aberto</span></span>
<span class="wzw-code-line">        socket.<span class="wzw-tk-fn">send</span>(texto);</span>
<span class="wzw-code-line">        </span>
<span class="wzw-code-line">        <span class="wzw-tk-comment">// Exibe no histórico local</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-fn">adicionarMensagem</span>(<span class="wzw-tk-str">&#039;Você&#039;</span>, texto, <span class="wzw-tk-str">&#039;msg-me&#039;</span>);</span>
<span class="wzw-code-line">        inputEl.value = <span class="wzw-tk-str">&#039;&#039;</span>;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">});</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">function</span> <span class="wzw-tk-fn">adicionarMensagem</span>(autor, texto, classe) {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> div = document.<span class="wzw-tk-fn">createElement</span>(<span class="wzw-tk-str">&#039;div&#039;</span>);</span>
<span class="wzw-code-line">    div.className = <span class="wzw-tk-str">`msg-bubble ${classe}`</span>;</span>
<span class="wzw-code-line">    div.innerHTML = <span class="wzw-tk-str">`${autor}: ${texto}`</span>;</span>
<span class="wzw-code-line">    messagesEl.<span class="wzw-tk-fn">appendChild</span>(div);</span>
<span class="wzw-code-line">    messagesEl.scrollTop = messagesEl.scrollHeight;<span class="wzw-tk-comment"> // Auto-scroll para a última mensagem</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// Código JavaScript do Chat
const statusEl = document.getElementById(&#039;chatStatus&#039;);
const messagesEl = document.getElementById(&#039;chatMessages&#039;);
const formEl = document.getElementById(&#039;chatForm&#039;);
const inputEl = document.getElementById(&#039;msgInput&#039;);

// 1. Conexão ao servidor de Echo público para demonstração imediata
// (Em produção, aponte para: &#039;wss://seu-servidor.com/ws&#039;)
const socket = new WebSocket(&#039;wss://echo.websocket.events&#039;);

// 2. Quando a conexão é confirmada
socket.onopen = () =&gt; {
    statusEl.className = &#039;status-online&#039;;
    statusEl.textContent = &#039;● Conectado (Full-Duplex)&#039;;
    adicionarMensagem(&#039;Sistema&#039;, &#039;Conectado à sala em tempo real!&#039;, &#039;msg-other&#039;);
};

// 3. Recebimento de mensagens vindas do servidor
socket.onmessage = (event) =&gt; {
    adicionarMensagem(&#039;Servidor Echo&#039;, event.data, &#039;msg-other&#039;);
};

// 4. Tratamento de encerramento de conexão
socket.onclose = () =&gt; {
    statusEl.className = &#039;status-offline&#039;;
    statusEl.textContent = &#039;○ Conexão Encerrada&#039;;
};

// 5. Envio de mensagem pelo usuário
formEl.addEventListener(&#039;submit&#039;, (e) =&gt; {
    e.preventDefault();
    const texto = inputEl.value.trim();

    if (texto &amp;&amp; socket.readyState === WebSocket.OPEN) {
        // Envia o dado pelo canal TCP aberto
        socket.send(texto);
        
        // Exibe no histórico local
        adicionarMensagem(&#039;Você&#039;, texto, &#039;msg-me&#039;);
        inputEl.value = &#039;&#039;;
    }
});

function adicionarMensagem(autor, texto, classe) {
    const div = document.createElement(&#039;div&#039;);
    div.className = `msg-bubble ${classe}`;
    div.innerHTML = `${autor}: ${texto}`;
    messagesEl.appendChild(div);
    messagesEl.scrollTop = messagesEl.scrollHeight; // Auto-scroll para a última mensagem
}</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer testar o chat WebSocket com eco bidirecional agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>5. Boas Práticas: Reconexão Automática e Heartbeat</h2>
<p>
    Diferente de conexões HTTP comuns ou SSE, a especificação básica do WebSocket não reconecta sozinha se o roteador Wi-Fi oscilar. Em sistemas de produção, aplicam-se duas práticas obrigatórias:
</p>
<ol>
<li>
        <strong>Heartbeat (Ping/Pong):</strong> O cliente envia uma mensagem minúscula (ex: <code>{"tipo": "ping"}</code>) a cada 25 segundos. Se o servidor não responder com um &#8220;pong&#8221;, o cliente assume que a conexão caiu silenciosamente e força uma reinicialização.
    </li>
<li>
        <strong>Reconexão com Backoff Exponencial:</strong> Caso o socket seja fechado por erro, a aplicação agenda uma nova tentativa de conexão em 1s, depois em 2s, 4s, 8s, até o teto máximo, impedindo um ataque de negação de serviço (DoS) involuntário contra seu próprio servidor.
    </li>
</ol>
<div class="wzw-pro-tip">
<h4>🎉 Parabéns! Você Concluiu o Módulo 3!</h4>
<p>
        Com esta lição sobre <strong>WebSockets</strong>, você finalizou com maestria todas as 15 aulas dedicadas ao <strong>HTML5 Moderno &#038; APIs Nativas</strong> (Lições 27 a 41).
    </p>
<p>
        Você dominou desde a semântica avançada e formulários inteligentes até gráficos com Canvas, vetores SVG, Drag &#038; Drop, Geolocalização, LocalStorage, Web Workers, SSE e WebSockets. Prepare-se para o <strong>Módulo 4: Prática, Acessibilidade &#038; Publicação Profissional</strong>, onde colocaremos tudo em produção com padrões de acessibilidade WCAG, performance e SEO internacional!
    </p>
</div>
<h2>6. Ferramentas Relacionadas &#038; Próximos Passos</h2>
<p>
    Continue seu desenvolvimento explorando as soluções práticas do nosso ecossistema:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/central-dev/">Central do Desenvolvedor Web</a>: Conversores JSON, geradores de dados e testadores de payloads em tempo real.</li>
<li><a href="https://webzoneware.com/web-ferramentas/hub-imagens/">Hub Master de Imagens</a>: Utilitários gráficos e otimizadores para avatares de chat.</li>
<li><a href="https://webzoneware.com/web-academy/html/server-sent-events-sse-html5/">Lição 40: Server-Sent Events (SSE)</a>: Revise o modelo unidirecional para feeds e notificações.</li>
<li><a href="https://webzoneware.com/web-academy/html/acessibilidade-web-aria-wcag/">Lição 42: Acessibilidade Web &#038; Diretrizes WCAG</a>: O início do Módulo 4 focado na criação de sites acessíveis e inclusivos para todos.</li>
</ul>
<h2>7. Referências Técnicas &#038; Especificações Oficiais</h2>
<ul>
<li><a href="https://datatracker.ietf.org/doc/html/rfc6455" target="_blank" rel="noopener">IETF RFC 6455: The WebSocket Protocol Official Specification</a></li>
<li><a href="https://html.spec.whatwg.org/multipage/web-sockets.html" target="_blank" rel="noopener">WHATWG HTML Living Standard: WebSockets API</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" target="_blank" rel="noopener">MDN Web Docs: The WebSocket API Guide &#038; Tutorials</a></li>
</ul>
<p><!-- Schema.org TechArticle JSON-LD --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "HTML5 WebSockets: Comunicação Bidirecional em Tempo Real",
  "description": "Aprenda a criar chats e jogos em tempo real com WebSockets no HTML5, comunicação full-duplex e conexão contínua segura.",
  "url": "https://webzoneware.com/web-academy/html/websockets-comunicacao-tempo-real/",
  "inLanguage": "pt-BR",
  "proficiencyLevel": "Advanced",
  "articleSection": "Web Academy - Curso de HTML & HTML5 Completo",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "url": "https://webzoneware.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "logo": {
      "@type": "ImageObject",
      "url": "https://webzoneware.com/wp-content/themes/astra-child/assets/images/logo.png"
    }
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/websockets-comunicacao-tempo-real/">HTML5 WebSockets: Guia de Comunicação Real | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-html/websockets-comunicacao-tempo-real/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
