Java中的Server-Sent Events:无需WebSocket即可实时发送数据

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java中的Server-Sent Events:当WebSocket过于复杂,而HTTP又不够用时

\n\n

您是否曾好奇过Twitter的新闻推送、Telegram的通知或体育比赛的实时结果是如何工作的?数据似乎会自动到达,无需刷新页面。秘密很简单:Server-Sent Events (SSE)——一种允许服务器通过普通HTTP连接向客户端实时发送数据的技术。

\n\n

在本文中,我们将深入探讨Java中的Server-Sent Events。您将了解为什么SSE通常比WebSocket更方便,如何使用Java Servlet API配置服务器,以及如何在客户端接收事件。代码将是可运行的,风格生动,示例尽可能贴近实际任务。

\n\n

什么是Server-Sent Events,为什么需要它们?

\n\n

Server-Sent Events (SSE) 是一种W3C标准,允许服务器通过一个长期存在的HTTP连接向客户端“推送”数据。客户端订阅事件流,服务器在事件发生时发送消息。

\n\n

SSE非常适合以下场景:

\n
    \n
  • 通知——新邮件、消息、状态变更。
  • \n
  • 新闻推送——帖子、推文、汇率。
  • \n
  • 监控——日志、服务器指标、任务进度。
  • \n
  • 实时数据——股票报价、比赛结果、天气。
  • \n
\n\n

与WebSocket不同,SSE仅支持单向通信(服务器→客户端),但这对于大多数场景已经足够。此外,SSE使用普通HTTP,无需额外端口,并且可以轻松通过代理和防火墙。

\n\n

Server-Sent Events vs WebSocket:如何选择?

\n\n

如果您只需要从服务器向客户端发送数据(无需反馈),请选择SSE。它更简单、更轻量、成本更低。当客户端也需要主动发送数据时(例如在聊天或在线游戏中),WebSocket才更合适。

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
标准Server-Sent EventsWebSocket
方向服务器 → 客户端双向
协议HTTP/1.1, HTTP/2ws:// 或 wss://
自动重连是(内置于浏览器)否(需要自行实现)
实现复杂度低中/高
浏览器支持所有现代浏览器所有现代浏览器
\n\n

对于PythonLib教育网站,我们选择了Java,因为它是服务器端开发的可靠语言。我们开始吧!

\n\n

服务器端:使用Servlet API在Java中实现SSE

\n\n

从服务器开始。最简单的方法是使用标准的Java Servlets。我们需要:

\n
    \n
  • 设置头部 Content-Type: text/event-stream。
  • \n
  • 禁用缓存(Cache-Control: no-cache)。
  • \n
  • 保持连接打开。
  • \n
  • 以 data: ...\\n\\n 格式发送数据。
  • \n
\n\n

示例1:基于Java Servlet的简单SSE服务器

\n\n

创建一个Servlet,每5秒发送一次当前时间。

\n\n
import javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalTime;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorServ                

博客

书籍推荐