<?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 server sent events html5 - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/server-sent-events-html5/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/server-sent-events-html5/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Wed, 21 Oct 2026 04:40:56 +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 server sent events html5 - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/server-sent-events-html5/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML5 Server-Sent Events (SSE): Guia &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-html/server-sent-events-sse-html5/</link>
					<comments>https://webzoneware.com/web-academy/curso-html/server-sent-events-sse-html5/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 04:40:05 +0000</pubDate>
				<category><![CDATA[Curso de HTML & HTML5]]></category>
		<category><![CDATA[eventsource html5]]></category>
		<category><![CDATA[push notifications web]]></category>
		<category><![CDATA[server sent events html5]]></category>
		<category><![CDATA[sse javascript]]></category>
		<category><![CDATA[streaming de dados em tempo real]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29353</guid>

					<description><![CDATA[<p>Tradicionalmente na web, a comunicação segue o modelo estrito de Requisição e Resposta: o navegador do cliente precisa pedir ativamente uma informação para que o servidor possa responder. No entanto, para feeds de notícias, placares esportivos, painéis financeiros e notificações, essa mecânica é ineficiente. A especificação do HTML5 introduziu os Server-Sent Events (SSE), permitindo que [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/server-sent-events-sse-html5/">HTML5 Server-Sent Events (SSE): Guia | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Tradicionalmente na web, a comunicação segue o modelo estrito de <em>Requisição e Resposta</em>: o navegador do cliente precisa pedir ativamente uma informação para que o servidor possa responder. No entanto, para feeds de notícias, placares esportivos, painéis financeiros e notificações, essa mecânica é ineficiente. A especificação do HTML5 introduziu os <strong>Server-Sent Events (SSE)</strong>, permitindo que o servidor mantenha uma conexão HTTP persistente aberta e <strong>&#8220;empurre&#8221; dados instantaneamente para o navegador (Push Unidirecional)</strong> no momento exato em que um evento acontece.
</p>
<h2>1. Adeus ao Polling Primitivo: A Eficiência do SSE</h2>
<p>
    Antes do SSE, os desenvolvedores eram obrigados a recorrer a técnicas ineficientes como o <strong>Short Polling</strong> (disparar requisições <code>fetch()</code> a cada 3 segundos via <code>setInterval</code>) ou o <strong>Long Polling</strong> (manter a requisição suspensa até haver resposta).
</p>
<p>
    Esse modelo tradicional gerava problemas graves de infraestrutura:
</p>
<ul>
<li>Desperdício colossal de largura de banda com o reenvio repetitivo de cabeçalhos HTTP e cookies.</li>
<li>Sobrecarga inútil da CPU do servidor processando milhares de requisições que retornavam respostas vazias.</li>
<li>Latência artificial na entrega de informações críticas ao usuário.</li>
</ul>
<div class="wzw-pro-tip">
<h4>💡 A Elegância do Server-Sent Events</h4>
<p>
        Com o SSE, o cliente faz <strong>uma única requisição HTTP inicial</strong>. O servidor responde com o tipo especial <code>Content-Type: text/event-stream</code> e mantém o canal aberto. A partir desse instante, sempre que surgir um dado novo, o servidor apenas transmite o fluxo de bytes pela conexão já estabelecida.
    </p>
</div>
<h2>2. A Anatomia do Protocolo SSE (text/event-stream)</h2>
<p>
    Diferente de protocolos binários complexos, o SSE é composto por texto puro formatado em UTF-8. Cada mensagem transmitida pelo servidor obedece a regras simples:
</p>
    <div class="wzw-ide-card" id="wzw-code-88429" 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">11 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-88429', 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-88429', 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">HTTP/<span class="wzw-tk-num">1.1</span> <span class="wzw-tk-num">200</span> OK</span>
<span class="wzw-code-line">Content-Type: text/event-stream; charset=utf-<span class="wzw-tk-num">8</span></span>
<span class="wzw-code-line">Cache-Control: no-cache</span>
<span class="wzw-code-line">Connection: keep-alive</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">data: {<span class="wzw-tk-str">&quot;ativo&quot;</span>: <span class="wzw-tk-str">&quot;BTC/USD&quot;</span>, <span class="wzw-tk-str">&quot;preco&quot;</span>: <span class="wzw-tk-num">68450.00</span>}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">event: alerta</span>
<span class="wzw-code-line">data: Volatilidade alta detectada no mercado!</span>
<span class="wzw-code-line">id: <span class="wzw-tk-num">1042</span></span>
<span class="wzw-code-line">retry: <span class="wzw-tk-num">5000</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>HTTP/1.1 200 OK
Content-Type: text/event-stream; charset=utf-8
Cache-Control: no-cache
Connection: keep-alive

data: {&quot;ativo&quot;: &quot;BTC/USD&quot;, &quot;preco&quot;: 68450.00}

event: alerta
data: Volatilidade alta detectada no mercado!
id: 1042
retry: 5000</textarea>
        </div>
    </div>
    
<h3>Campos Padronizados pelo Protocolo:</h3>
<ul>
<li><code>data:</code> O corpo da mensagem ou payload útil (pode ser texto simples ou uma string JSON).</li>
<li><code>event:</code> O nome de um evento customizado. Permite escutar tipos diferentes de ações no cliente.</li>
<li><code>id:</code> Identificador único do evento. Se a internet do usuário oscilar e cair, o navegador envia automaticamente o cabeçalho <code>Last-Event-ID</code> na reconexão, garantindo que nenhuma mensagem seja perdida!</li>
<li><code>retry:</code> Tempo em milissegundos que o navegador deve aguardar antes de tentar reconectar automaticamente caso a conexão seja interrompida.</li>
<li><code>\n\n</code> (Dupla quebra de linha): Sinaliza ao navegador o término do pacote e dispara o processamento do evento.</li>
</ul>
<h2>3. A API EventSource no Navegador (Cliente)</h2>
<p>
    No JavaScript do front-end, consumir uma transmissão SSE é extremamente simples através da classe nativa <code>EventSource</code>:
</p>
    <div class="wzw-ide-card" id="wzw-code-27170" 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">26 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-27170', 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-27170', 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">// 1. Abre a conexão com o endpoint de streaming do servidor</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> streamNoticias = <span class="wzw-tk-kw">new</span> <span class="wzw-tk-fn">EventSource</span>(<span class="wzw-tk-str">&#039;/api/cotacoes-tempo-real&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 2. Conexão aberta com sucesso</span></span>
<span class="wzw-code-line">streamNoticias.onopen = <span class="wzw-tk-kw">function</span>() {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">&#039;✅ Conexão SSE estabelecida com sucesso.&#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 genéricas (campos &#039;data:&#039;)</span></span>
<span class="wzw-code-line">streamNoticias.onmessage = <span class="wzw-tk-kw">function</span>(event) {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> dados = JSON.<span class="wzw-tk-fn">parse</span>(event.data);</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">&#039;Nova cotação recebida:&#039;</span>, dados);</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. Escuta de eventos tipados específicos (campo &#039;event: alerta&#039;)</span></span>
<span class="wzw-code-line">streamNoticias.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;alerta&#039;</span>, <span class="wzw-tk-kw">function</span>(event) {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">warn</span>(<span class="wzw-tk-str">&#039;⚠️ Alerta prioritário do sistema:&#039;</span>, event.data);</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. Tratamento de falhas e reconexão automática</span></span>
<span class="wzw-code-line">streamNoticias.onerror = <span class="wzw-tk-kw">function</span>(erro) {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">&#039;Conexão perdida. O navegador tentará reconectar sozinho...&#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">// 6. Fechamento manual da conexão quando o usuário sair da tela</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// streamNoticias.close();</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// 1. Abre a conexão com o endpoint de streaming do servidor
const streamNoticias = new EventSource(&#039;/api/cotacoes-tempo-real&#039;);

// 2. Conexão aberta com sucesso
streamNoticias.onopen = function() {
    console.log(&#039;✅ Conexão SSE estabelecida com sucesso.&#039;);
};

// 3. Recebimento de mensagens genéricas (campos &#039;data:&#039;)
streamNoticias.onmessage = function(event) {
    const dados = JSON.parse(event.data);
    console.log(&#039;Nova cotação recebida:&#039;, dados);
};

// 4. Escuta de eventos tipados específicos (campo &#039;event: alerta&#039;)
streamNoticias.addEventListener(&#039;alerta&#039;, function(event) {
    console.warn(&#039;⚠️ Alerta prioritário do sistema:&#039;, event.data);
});

// 5. Tratamento de falhas e reconexão automática
streamNoticias.onerror = function(erro) {
    console.log(&#039;Conexão perdida. O navegador tentará reconectar sozinho...&#039;);
};

// 6. Fechamento manual da conexão quando o usuário sair da tela
// streamNoticias.close();</textarea>
        </div>
    </div>
    
<h2>4. Código Prático Completo: Painel de Cotações em Tempo Real</h2>
<p>
    Abaixo implementamos uma interface de monitoramento com controle de status visual de conexão e exibição de dados recebidos via streaming:
</p>
    <div class="wzw-ide-card" id="wzw-code-63399" 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">18 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-63399', 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-63399', 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-sse-card&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;sse-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>📈 Painel de Cotações em Tempo Real (SSE)<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;statusBadge&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;badge-conectando&quot;</span><span class="wzw-tk-tag">&gt;</span>Conectando...<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-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;price-display&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;currency-label&quot;</span><span class="wzw-tk-tag">&gt;</span>Bitcoin (BTC/BRL):<span class="wzw-tk-tag">&lt;/span&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;valorPreco&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;price-value&quot;</span><span class="wzw-tk-tag">&gt;</span>R$ 0,00<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-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;log-container&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;h4&gt;</span>Histórico de Atualizações Push:<span class="wzw-tk-tag">&lt;/h4&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;ul</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;listaHistorico&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;sse-logs&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/ul&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-tag">&lt;button</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;btnDesconectar&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-sse&quot;</span><span class="wzw-tk-tag">&gt;</span>Interromper Transmissão<span class="wzw-tk-tag">&lt;/button&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-sse-card&quot;&gt;
    &lt;div class=&quot;sse-header&quot;&gt;
        &lt;h3&gt;📈 Painel de Cotações em Tempo Real (SSE)&lt;/h3&gt;
        &lt;span id=&quot;statusBadge&quot; class=&quot;badge-conectando&quot;&gt;Conectando...&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;price-display&quot;&gt;
        &lt;span class=&quot;currency-label&quot;&gt;Bitcoin (BTC/BRL):&lt;/span&gt;
        &lt;span id=&quot;valorPreco&quot; class=&quot;price-value&quot;&gt;R$ 0,00&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;log-container&quot;&gt;
        &lt;h4&gt;Histórico de Atualizações Push:&lt;/h4&gt;
        &lt;ul id=&quot;listaHistorico&quot; class=&quot;sse-logs&quot;&gt;&lt;/ul&gt;
    &lt;/div&gt;

    &lt;button id=&quot;btnDesconectar&quot; class=&quot;btn-sse&quot;&gt;Interromper Transmissão&lt;/button&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-39301" 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">60 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-39301', 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-39301', 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-sse-card {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">24px</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">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">max-width</span>: <span class="wzw-tk-num">520px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.sse-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">margin-bottom</span>: <span class="wzw-tk-num">16px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.price-display {</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">background-color</span>: <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">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">margin-bottom</span>: <span class="wzw-tk-num">16px</span>;</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>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.price-value {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#10b981</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.badge-conectando { background: <span class="wzw-tk-num">#f59e0b</span>; color: <span class="wzw-tk-num">#000</span>; padding: <span class="wzw-tk-num">4px</span> <span class="wzw-tk-num">8px</span>; border-radius: <span class="wzw-tk-num">4px</span>; font-size: <span class="wzw-tk-num">0.75rem</span>; font-weight: bold; }</span>
<span class="wzw-code-line">.badge-online { background: <span class="wzw-tk-num">#10b981</span>; color: <span class="wzw-tk-num">#fff</span>; padding: <span class="wzw-tk-num">4px</span> <span class="wzw-tk-num">8px</span>; border-radius: <span class="wzw-tk-num">4px</span>; font-size: <span class="wzw-tk-num">0.75rem</span>; font-weight: bold; }</span>
<span class="wzw-code-line">.badge-offline { background: <span class="wzw-tk-num">#ef4444</span>; color: <span class="wzw-tk-num">#fff</span>; padding: <span class="wzw-tk-num">4px</span> <span class="wzw-tk-num">8px</span>; border-radius: <span class="wzw-tk-num">4px</span>; font-size: <span class="wzw-tk-num">0.75rem</span>; font-weight: bold; }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.sse-logs {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">list-style</span>: none;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: 0;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">max-height</span>: <span class="wzw-tk-num">140px</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">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#94a3b8</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.sse-logs li {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">6px</span> 0;</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">#1e293b</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-sse {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">margin-top</span>: <span class="wzw-tk-num">16px</span>;</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">16px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#ef4444</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-sse-card {
    padding: 24px;
    background-color: #0f172a;
    border: 1px solid #1e293b;
    border-radius: 8px;
    color: #f8fafc;
    max-width: 520px;
}

.sse-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 16px;
}

.price-display {
    padding: 16px;
    background-color: #1e293b;
    border-radius: 6px;
    margin-bottom: 16px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.price-value {
    font-size: 1.5rem;
    font-weight: 700;
    color: #10b981;
}

.badge-conectando { background: #f59e0b; color: #000; padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: bold; }
.badge-online { background: #10b981; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: bold; }
.badge-offline { background: #ef4444; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: bold; }

.sse-logs {
    list-style: none;
    padding: 0;
    max-height: 140px;
    overflow-y: auto;
    font-size: 0.85rem;
    color: #94a3b8;
}

.sse-logs li {
    padding: 6px 0;
    border-bottom: 1px solid #1e293b;
}

.btn-sse {
    margin-top: 16px;
    padding: 10px 16px;
    background-color: #ef4444;
    color: #fff;
    border: none;
    border-radius: 6px;
    cursor: pointer;
    font-weight: 600;
}</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-69396" 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">37 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-69396', 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-69396', 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">// Script de Demonstração (Simulador de Servidor Local para Testes)</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> statusBadge = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;statusBadge&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> valorPreco = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;valorPreco&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> listaHistorico = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;listaHistorico&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> btnDesconectar = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;btnDesconectar&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Em um ambiente de produção real, aponte para sua URL de API (ex: &#039;/api/stream-cotacoes&#039;)</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// const stream = new EventSource(&#039;/api/stream-cotacoes&#039;);</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Para demonstração imediata no navegador, simulamos o comportamento de recebimento:</span></span>
<span class="wzw-code-line">statusBadge.className = <span class="wzw-tk-str">&#039;badge-online&#039;</span>;</span>
<span class="wzw-code-line">statusBadge.textContent = <span class="wzw-tk-str">&#039;● Transmitindo ao Vivo&#039;</span>;</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">adicionarLog</span>(texto) {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> li = document.<span class="wzw-tk-fn">createElement</span>(<span class="wzw-tk-str">&#039;li&#039;</span>);</span>
<span class="wzw-code-line">    li.textContent = <span class="wzw-tk-str">`[${new Date().toLocaleTimeString()}] ${texto}`</span>;</span>
<span class="wzw-code-line">    listaHistorico.<span class="wzw-tk-fn">prepend</span>(li);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Simulação de eventos empurrados pelo servidor a cada 3 segundos</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">let</span> precoSimulado = <span class="wzw-tk-num">380250.00</span>;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> simuladorInterval = <span class="wzw-tk-fn">setInterval</span>(() =&gt; {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> variacao = (Math.<span class="wzw-tk-fn">random</span>() - <span class="wzw-tk-num">0.48</span>) * <span class="wzw-tk-num">1200</span>;</span>
<span class="wzw-code-line">    precoSimulado += variacao;</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    valorPreco.textContent = precoSimulado.<span class="wzw-tk-fn">toLocaleString</span>(<span class="wzw-tk-str">&#039;pt-BR&#039;</span>, { style: <span class="wzw-tk-str">&#039;currency&#039;</span>, currency: <span class="wzw-tk-str">&#039;BRL&#039;</span> });</span>
<span class="wzw-code-line">    <span class="wzw-tk-fn">adicionarLog</span>(<span class="wzw-tk-str">`Cotação atualizada: ${precoSimulado.toFixed(2)} BRL`</span>);</span>
<span class="wzw-code-line">}, <span class="wzw-tk-num">3000</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">btnDesconectar.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;click&#039;</span>, () =&gt; {</span>
<span class="wzw-code-line">    <span class="wzw-tk-fn">clearInterval</span>(simuladorInterval);</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">// stream.close();</span></span>
<span class="wzw-code-line">    statusBadge.className = <span class="wzw-tk-str">&#039;badge-offline&#039;</span>;</span>
<span class="wzw-code-line">    statusBadge.textContent = <span class="wzw-tk-str">&#039;Desconectado&#039;</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-fn">adicionarLog</span>(<span class="wzw-tk-str">&#039;Conexão encerrada pelo usuário.&#039;</span>);</span>
<span class="wzw-code-line">    btnDesconectar.disabled = <span class="wzw-tk-kw">true</span>;</span>
<span class="wzw-code-line">});</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// Script de Demonstração (Simulador de Servidor Local para Testes)
const statusBadge = document.getElementById(&#039;statusBadge&#039;);
const valorPreco = document.getElementById(&#039;valorPreco&#039;);
const listaHistorico = document.getElementById(&#039;listaHistorico&#039;);
const btnDesconectar = document.getElementById(&#039;btnDesconectar&#039;);

// Em um ambiente de produção real, aponte para sua URL de API (ex: &#039;/api/stream-cotacoes&#039;)
// const stream = new EventSource(&#039;/api/stream-cotacoes&#039;);

// Para demonstração imediata no navegador, simulamos o comportamento de recebimento:
statusBadge.className = &#039;badge-online&#039;;
statusBadge.textContent = &#039;● Transmitindo ao Vivo&#039;;

function adicionarLog(texto) {
    const li = document.createElement(&#039;li&#039;);
    li.textContent = `[${new Date().toLocaleTimeString()}] ${texto}`;
    listaHistorico.prepend(li);
}

// Simulação de eventos empurrados pelo servidor a cada 3 segundos
let precoSimulado = 380250.00;
const simuladorInterval = setInterval(() =&gt; {
    const variacao = (Math.random() - 0.48) * 1200;
    precoSimulado += variacao;

    valorPreco.textContent = precoSimulado.toLocaleString(&#039;pt-BR&#039;, { style: &#039;currency&#039;, currency: &#039;BRL&#039; });
    adicionarLog(`Cotação atualizada: ${precoSimulado.toFixed(2)} BRL`);
}, 3000);

btnDesconectar.addEventListener(&#039;click&#039;, () =&gt; {
    clearInterval(simuladorInterval);
    // stream.close();
    statusBadge.className = &#039;badge-offline&#039;;
    statusBadge.textContent = &#039;Desconectado&#039;;
    adicionarLog(&#039;Conexão encerrada pelo usuário.&#039;);
    btnDesconectar.disabled = true;
});</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer testar o Server-Sent Events e streaming no navegador?</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. Comparativo: Server-Sent Events vs WebSockets</h2>
<p>
    Ambas são tecnologias de tempo real do ecossistema HTML5 moderno, mas com arquiteturas projetadas para necessidades diferentes:
</p>
<div class="wzw-table-responsive">
<table class="wzw-tech-table">
<thead>
<tr>
<th>Critério</th>
<th>Server-Sent Events (SSE)</th>
<th>WebSockets (WS)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Direção do Fluxo</strong></td>
<td>Unidirecional (apenas Servidor &rarr; Cliente)</td>
<td>Totalmente Bidirecional (Cliente &harr; Servidor)</td>
</tr>
<tr>
<td><strong>Protocolo</strong></td>
<td>HTTP / HTTP/2 padrão (porta 80 ou 443)</td>
<td>Protocolo TCP próprio com handshake (<code>ws://</code> ou <code>wss://</code>)</td>
</tr>
<tr>
<td><strong>Reconexão Automática</strong></td>
<td>Nativa pelo navegador (sem nenhuma linha de código)</td>
<td>Manual (requer bibliotecas ou tratamento via código)</td>
</tr>
<tr>
<td><strong>Compatibilidade com Proxies e Firewalls</strong></td>
<td>100% transparente em qualquer proxy ou CDN existente</td>
<td>Pode ser bloqueado por firewalls e proxies corporativos restritivos</td>
</tr>
<tr>
<td><strong>Cenário Perfeito</strong></td>
<td>Feeds de notícias, dashboards, cotações, notificações</td>
<td>Jogos online multiplayer, salas de bate-papo, edição colaborativa</td>
</tr>
</tbody>
</table>
</div>
<div class="wzw-pro-tip">
<h4>💡 Dica Pro: O Limite de Conexões HTTP/1.1 vs HTTP/2</h4>
<p>
        No protocolo legado <strong>HTTP/1.1</strong>, os navegadores impõem um limite rígido de apenas <strong>6 conexões simultâneas abertas</strong> por domínio. Se você abrir 6 abas com SSE, a 7ª aba travará sem conseguir carregar imagens ou páginas!
    </p>
<p>
        <strong>A solução moderna:</strong> Certifique-se de que seu servidor web utilize <strong>HTTP/2 ou HTTP/3</strong>. Nesses protocolos, múltiplas conexões e streams são multiplexados dentro de uma única conexão TCP física, eliminando totalmente o limite de abas.
    </p>
</div>
<h2>6. Ferramentas Relacionadas &#038; Próximos Passos</h2>
<p>
    Continue seu domínio de tecnologias interativas com as ferramentas do nosso ecossistema:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/central-dev/">Central do Desenvolvedor Web</a>: Conversores JSON, geradores de payload e utilitários para depuração de rede.</li>
<li><a href="https://webzoneware.com/web-ferramentas/hub-imagens/">Hub Master de Imagens</a>: Otimize ícones de alerta e status visual para dashboards.</li>
<li><a href="https://webzoneware.com/web-academy/html/web-workers-multithreading-html5/">Lição 39: Web Workers &#038; Multithreading</a>: Combine o recebimento de fluxos SSE com processamento em segundo plano.</li>
<li><a href="https://webzoneware.com/web-academy/html/websockets-comunicacao-tempo-real/">Lição 41: WebSockets &#038; Comunicação em Tempo Real</a>: Conheça o protocolo bidirecional completo para jogos e chats.</li>
</ul>
<h2>7. Referências Técnicas &#038; Especificações Oficiais</h2>
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/server-sent-events.html" target="_blank" rel="noopener">WHATWG HTML Living Standard: Server-Sent Events Specification</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events" target="_blank" rel="noopener">MDN Web Docs: Using Server-Sent Events</a></li>
<li><a href="https://www.w3.org/TR/eventsource/" target="_blank" rel="noopener">W3C Server-Sent Events Recommendation</a></li>
</ul>
<p><!-- Schema.org TechArticle JSON-LD --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "HTML5 Server-Sent Events (SSE): Streaming de Dados em Tempo Real",
  "description": "Aprenda a transmitir dados do servidor para o navegador em tempo real com Server-Sent Events (SSE) e EventSource no HTML5.",
  "url": "https://webzoneware.com/web-academy/html/server-sent-events-sse-html5/",
  "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/server-sent-events-sse-html5/">HTML5 Server-Sent Events (SSE): Guia | 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/server-sent-events-sse-html5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
