三语言实现WebSocket实时推送Demo
1. 写在前面做后端开发的朋友应该都有过这样的经历页面上的数据要实时刷新轮询太浪费资源长连接又不好维护。后来接触了 WebSocket才发现这东西确实好用。今天不聊太深的理论就从一个实际的小需求出发用 Python、Java、PHP 三种语言分别写一个最简单的推送 Demo把消息从服务端推到客户端。代码都不长跑起来就能看到效果。2. WebSocket 到底解决了什么问题以前我们做消息推送最常用的办法就是前端定时去问后端“有没有新消息”也就是轮询。这种方式实现简单但服务器压力大而且消息不及时。WebSocket 不一样它是一条全双工的通道服务端可以主动把消息推给客户端不用等客户端来问。像在线聊天、订单提醒、后台通知这类场景用 WebSocket 就非常合适。简单理解WebSocket 就是让浏览器和服务器之间建立一条“常驻”的管道两边随时都能往管道里塞数据。下面我们就用三种语言分别搭一条这样的管道。3. Python 版用 websockets 库实现Python 这边我习惯用websockets这个库安装和写起来都比较顺手。先装依赖pip install websockets然后写一个最简单的服务端监听 8765 端口收到客户端连接后主动推一条消息过去import asyncio import websockets async def handler(websocket, path): # 客户端连上来之后主动推送一条消息 await websocket.send(Hello from Python WebSocket!) print(消息已推送) async def main(): async with websockets.serve(handler, localhost, 8765): print(服务已启动端口 8765) await asyncio.Future() # 保持运行 if __name__ __main__: asyncio.run(main())客户端这边用浏览器或者写个小脚本都行。用 Python 客户端验证一下import asyncio import websockets async def client(): async with websockets.connect(ws://localhost:8765) as ws: msg await ws.recv() print(收到消息:, msg) asyncio.run(client())跑起来之后服务端控制台会打印“消息已推送”客户端会打印收到的内容。整个流程非常直观。4. Java 版用 Spring Boot WebSocketJava 这边我用 Spring Boot 来做因为它在 WebSocket 这块封装得比较成熟配置也少。先建一个 Spring Boot 项目引入依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency然后写一个 WebSocket 配置类把处理器注册进去import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; Configuration EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new PushHandler(), /push).setAllowedOrigins(*); } }再写一个处理器类客户端连上来之后服务端主动推送一条消息import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; public class PushHandler extends TextWebSocketHandler { Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 连接建立后主动推送 session.sendMessage(new TextMessage(Hello from Java WebSocket!)); System.out.println(消息已推送); } }启动项目后浏览器里打开一个 WebSocket 测试页面连接ws://localhost:8080/push就能收到服务端推过来的消息。这里要注意Spring Boot 默认端口是 8080如果改了端口记得同步调整连接地址。5. PHP 版用 Workerman 实现PHP 做 WebSocket 一般会借助 Workerman 这个常驻内存框架它本身对长连接支持得比较好。先通过 Composer 安装composer require workerman/workerman然后写一个简单的服务端脚本监听 2346 端口客户端连上来后推送一条消息?php use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; $worker new Worker(websocket://0.0.0.0:2346); $worker-onConnect function ($connection) { // 客户端连上来之后主动推送 $connection-send(Hello from PHP WebSocket!); echo 消息已推送\n; }; Worker::runAll();启动方式也简单在命令行里执行php server.php start客户端连接ws://localhost:2346就能收到消息。Workerman 的好处是它本身是常驻进程不用依赖 PHP-FPM适合做实时推送这类场景。6. 三种实现放一起对比语言核心依赖启动方式适用场景Pythonwebsockets直接运行脚本轻量工具、快速原型JavaSpring Boot启动 Spring 应用企业级项目、复杂业务PHPWorkerman命令行常驻进程中小型实时应用选哪种语言主要看你的项目技术栈和团队熟悉程度。如果只是做个内部小工具Python 最省事如果是正式业务系统Java 的生态更完整PHP 项目里想加实时推送Workerman 是个不错的选择。7. 踩坑提醒最后说几个我实际踩过的坑给大家提个醒。第一WebSocket 连接是长连接服务端要注意心跳检测不然客户端断网了服务端还不知道。第二跨域问题浏览器里调试的时候记得把跨域放开不然连接会被拦下来。第三生产环境一定要上 SSL也就是 wss 协议不然浏览器会拒绝连接。这几个 Demo 虽然简单但把核心链路跑通了。后面要做的无非是加上消息广播、用户鉴权、消息持久化这些思路都是一样的。希望这篇文章能帮刚接触 WebSocket 的朋友少走点弯路。

相关新闻

Rust异步内存泄漏检测工具RTK原理与实战

Rust异步内存泄漏检测工具RTK原理与实战

1. RTK(Rust Token Killer)到底是什么?别被名字吓住,它其实是个“内存泄漏显微镜”刚看到“Rust Token Killer”这个名字,我第一反应是:又一个带“Killer”的硬核工具?是不是要干掉什么底层机制…

2026/10/18 6:19:49 阅读更多 →
Selenium八大定位器与显式等待:从原理到实战的稳定自动化方案

Selenium八大定位器与显式等待:从原理到实战的稳定自动化方案

做Web自动化这几年,前前后后看过不少脚本,也帮团队整理过很多次用例。问得最多、踩坑最深的往往不在框架选型上,而在最基础的两件事:元素定位和等待策略。什么八大定位器、显式等待,概念大家都会背,一上手就…

2026/10/18 6:18:49 阅读更多 →
开源教程被AI推荐背后:内容结构如何影响大模型引用

开源教程被AI推荐背后:内容结构如何影响大模型引用

1. 一个教程项目被大模型推荐,意味着什么先交代背景。我维护了一套面向零基础开发者的 AI 编程入门教程,纯开源、纯文档,没有花哨的官网,也没有做任何付费投放。前段时间有读者截图给我,说在某个国产 AI 助手里问“AI …

2026/10/18 6:18:49 阅读更多 →

最新新闻

Netty实战进阶:粘包半包、EventLoop线程边界与长连接心跳

Netty实战进阶:粘包半包、EventLoop线程边界与长连接心跳

不少人可能和我有同样的感受:Netty的入门教程看了一遍又一遍,Echo服务器、聊天室Demo敲得飞起,但一到真实项目里要“实战应用”了,反而手足无措。客户端发过来的数据一多,消息全黏在一起;连接一挂&#xff…

2026/10/18 7:17:00 阅读更多 →
扫码点餐小程序多门店源码跑通指南

扫码点餐小程序多门店源码跑通指南

简介:这是一套基于Java后端与uniapp(Vue3)前端实现的在线点餐小程序完整源码,面向计算机、电子信息等专业学生及初级全栈开发者,适用于课程设计、期末大作业或毕业设计参考。系统支持扫码点餐、外卖配送与到店自取双模…

2026/10/18 7:17:00 阅读更多 →
新能源汽车实训仿真教学软件选型与课堂实施经验

新能源汽车实训仿真教学软件选型与课堂实施经验

做职业教育这行的人,多半都有过一种尴尬:理论课讲得头头是道,学生一到实训车跟前就手足无措。尤其是新能源汽车实训,教材上写的、课件里放的、实车上摸的,三者经常对不上。前几年我们引了一套以比亚迪秦EV为原型的电动…

2026/10/18 7:17:00 阅读更多 →
结合AI客户端玩转go MCP项目开发:TaoToken统一Key接入实战

结合AI客户端玩转go MCP项目开发:TaoToken统一Key接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 7:17:00 阅读更多 →
鸿蒙编码与安全双翼:中小企业智能化改造的落地指南

鸿蒙编码与安全双翼:中小企业智能化改造的落地指南

前几天一位做设备运维的中小企业负责人找我,说客户要求巡检数据必须可追溯、不能外泄,而他们过去的办法是拍照发到工作群。这个场景我最近半年至少遇到过五次,几乎已经成为中小企业在智能化改造里最典型的痛点。很多人一听到“鸿蒙编码”和“…

2026/10/18 7:17:00 阅读更多 →
返利系统架构设计:订单归集、分润与对账全链路解析

返利系统架构设计:订单归集、分润与对账全链路解析

做返利类APP这事,外行看着简单——不就是把商品链接套上推广参数丢给用户,等平台结算佣金再返一部分出去吗?真上手你会知道,开发量最大的根本不是前端页面,而是后端的订单归集、分润和对账三块。这三块任何一个环节出问…

2026/10/18 7:16:00 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →