elli WebSocket 实现指南:Handover 机制让双工通信更简单的 30 分钟实战
elli WebSocket 实现指南Handover 机制让双工通信更简单的 30 分钟实战【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/ellielli 是一个简单、健壮且高性能的 Erlang web server专为 HTTP API 场景设计但你同样可以用它轻松实现 WebSocket 服务。本文将带你用 30 分钟掌握 elli 的 Handover 机制它能把 TCP socket 的控制权直接交给你的业务代码让你从零搭建一个双工通信服务。无论你是 Erlang 新手还是正在选型 WebSocket 服务器方案这份 elli WebSocket 实现指南都能帮你快速上手。为什么用 elli 做 WebSocket 服务先说结论elli 本身不内置 WebSocket 协议解析但它提供了一条极其优雅的逃生通道——Handover。相比 Cowboy 等重型框架elli 的核心优势在于特性说明 高性能基于 acceptor 池 事件驱动文档称其为 performant Erlang web server 极简源码仅十几个模块无重型依赖学习成本低 可扩展Middleware 机制支持请求预处理与多 handler 链式路由 精准控制Handover 把连接控制权交给用户协议实现完全自由更关键的是elli 的 CHANGELOG.md 明确提到Handover a socket to user code, making it possible to implement WebSockets也就是说 Handover 机制的设计初衷之一就是为 WebSocket 这类长连接双工协议提供实现空间。Handover 机制的核心原理连接控制权交接 在了解实战之前先花 2 分钟搞懂原理。elli 的请求处理流程通常是这样连接建立 → 解析 HTTP 请求 → 调用回调函数 → 返回响应。而 Handover 机制在中间插入了一个岔路口%% 位于 elli_http.erl 的 handle_request/4 case init(Req) of {ok, standard} - %% 标准流程读 body、执行回调、返回响应 ...; {ok, handover} - %% Handover 流程直接调用你的 handle/2 %% 由你的代码接管整个 socket Req1 Req#req{body B1}, Response Mod:handle(Req1, Args), Response end这段逻辑就在 elli_http.erl。当你的回调模块在init/2中返回{ok, handover}时elli 就不再按 HTTP 语义处理这个连接而是把Req其中携带了socket字段直接交给你的handle/2函数。一句话总结Handover 就像你把方向盘交给了司机——之后车怎么开协议怎么聊完全由你决定。这正是实现 WebSocket 升级握手的理想切入点。30 分钟实战搭建基于 Handover 的 WebSocket 服务 ️第一步获取并编译 elli 源码约 3 分钟首先克隆项目源码git clone https://gitcode.com/gh_mirrors/ell/elli cd elli make项目使用 rebar 构建依赖为空deps, []编译非常轻量。编译通过后你可以先跑一下测试验证环境make eunit其中 elli_handover_tests.erl 就是 Handover 路径的集成测试用例稍后我们会对照它来理解代码。第二步从官方示例理解 Handover 触发方式约 10 分钟elli 提供了一个开箱即用的示例模块 elli_example_callback_handover.erl它展示了 Handover 的完整用法核心逻辑分为三部分1. 在 init/2 中判定哪些请求走 Handoverinit(Req, _Args) - case elli_request:path(Req) of [hello, world] - {ok, handover}; %% 命中路径 → 触发 Handover _ - ignore %% 其他路径 → 标准流程 end.2. 在 handle/2 中接管连接直接使用底层 socket 通信handle(GET, [hello, world], Req, _Args) - Body Hello World!, Size list_to_binary(integer_to_list(size(Body))), %% 绕过 elli 的响应封装直接通过 socket 发送 elli_http:send_response(Req, 200, [{Connection, close}, {Content-Length, Size}], Body), {close, }; %% 返回 {close, _} 表示处理完毕后关闭连接3. 其他请求照常走普通 HTTP 流程handle(GET, [hello], Req, _Args) - Name elli_request:get_arg(name, Req, undefined), {ok, [], Hello , Name/binary}.⚠️ 注意{close, }这个返回值——它告诉 elli连接已由我处理完毕请关闭 socket。如果你的 WebSocket 连接要保持长连接这里就要返回相应的长连接语义例如持续循环接收数据这也是从 Handover 到 WebSocket 的关键一步。第三步改造为真正的 WebSocket 双工通信约 15 分钟现在你已经掌握了 Handover 的骨架要让它升级成 WebSocket 服务只需要做两件事完成 HTTP 升级握手在handle/2中读取请求头校验Upgrade: websocket与Sec-WebSocket-Key然后向客户端返回101 Switching Protocols响应进入消息循环握手成功后用gen_tcp:recv/2循环读取客户端帧解析 WebSocket 帧格式FIN、opcode、mask、payload length 等并调用gen_tcp:send/2回写数据。由于 socket 已经握在你手里双工通信的实现完全透明。你可以按需实现 ping/pong 心跳、分片消息、二进制帧等功能不受 elli 框架的任何约束。启动服务的方式与普通 elli 服务完全一致只需把 callback 换成我们的模块{ok, Pid} elli:start_link([{callback, elli_example_callback_handover}, {port, 3003}]).参考 elli_handover_tests.erl 中的setup/0你可以照葫芦画瓢写出自己的启动与集成测试。进阶Handover 与 Middleware 的搭配技巧 如果你的项目需要鉴权、压缩等横切逻辑可以借助 elli_middleware.erl 实现多 handler 链式处理。Middleware 本身也是一个 elli handler支持预处理与后处理例如Config [{mods, [ {elli_example_middleware, []}, %% 前置中间件 {elli_middleware_compress, []}, %% 压缩中间件 {elli_example_callback_handover, []} %% 真正的业务回调Handover ]}], elli:start_link([..., {callback, elli_middleware}, {callback_args, Config}]).推荐把鉴权、日志放在前置中间件让 Handover 回调专注于 WebSocket 协议本身这样职责清晰、便于测试。常见问题与避坑指南 为什么我的 handover 请求没有触发检查init/2的返回值必须是{ok, handover}原子元组且你的模块需要导出init/2、handle/2、handle_event/3三个函数见 elli_example_callback_handover.erl。WebSocket 长连接如何保持Handover 后 elli 默认流程已结束你需要在自己的handle/2里维护消息循环注意设置合适的 socket 接收超时并实现心跳机制防掉线。性能如何保障elli 每个连接由独立进程处理天然契合 Erlang 的并发模型。WebSocket 长连接占用的进程资源远低于短连接风暴配合min_acceptors参数调节 elli.erl 中的 acceptor 池大小即可。想用现成的 WebSocket 库社区有基于 Handover 构建的 elli_websocket 扩展你可以在 CHANGELOG 的 v1.0 说明中找到线索再结合本文原理自行集成。总结 ✅通过本文的 30 分钟实战你学会了elli 作为Erlang web server的轻量、高性能特性Handover 机制的本质init/2返回{ok, handover}后连接控制权交给用户代码基于 elli_example_callback_handover.erl 改造出 WebSocket 双工通信服务的完整思路与 Middleware 搭配以及常见坑位的规避方法。elli 的哲学是框架只管 HTTP协议自由发挥。Handover 机制就像一把万能钥匙让 WebSocket 这类双工协议在你的 Erlang 服务中轻松落地。现在就 clone 一份源码动手试试吧30 分钟后你也能拥有自己的 WebSocket 服务【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/elli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

YoloDotNet快速上手指南:零基础用C跑通图像目标检测

YoloDotNet快速上手指南:零基础用C跑通图像目标检测

YoloDotNet快速上手指南:零基础用C#跑通图像目标检测 【免费下载链接】YoloDotNet YoloDotNet - A C# .NET 8.0 project for Classification, Object Detection, OBB Detection, Segmentation and Pose Estimation in both images and live video streams. 项目地…

2026/10/16 11:24:27 阅读更多 →
从“手柄不被识别“到“即插即用“:ViGEmBus 虚拟手柄驱动快速上手指南

从“手柄不被识别“到“即插即用“:ViGEmBus 虚拟手柄驱动快速上手指南

从"手柄不被识别"到"即插即用":ViGEmBus 虚拟手柄驱动快速上手指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 深夜十一…

2026/9/30 11:33:41 阅读更多 →
Linux系统下R语言环境搭建与包管理全攻略

Linux系统下R语言环境搭建与包管理全攻略

1. 项目概述:为什么要在Linux上折腾R?如果你是一个数据分析师、生物信息学研究员或者任何需要处理统计计算和可视化的开发者,那么R语言大概率是你工具箱里的常客。在Windows或macOS上,R的安装通常就是点几下鼠标的事,但…

2026/10/7 3:54:38 阅读更多 →

最新新闻

上海医保五期接口设计拆解:有状态账本、两阶段确认与身份令牌机制

上海医保五期接口设计拆解:有状态账本、两阶段确认与身份令牌机制

简介:上海五期医保接口说明文档,是一份指导 HIS 系统对接医保中心系统的技术参考,面向医院信息系统开发、实施与维护人员。文档从引言、业务分析到接口描述逐层展开,涵盖读卡、电子凭证解码、挂号收费请求与确认、登记与撤销、明细…

2026/10/16 21:56:13 阅读更多 →
权力的游戏86节点深度解析:三条线索交汇与叙事结构拆解

权力的游戏86节点深度解析:三条线索交汇与叙事结构拆解

1. 从“86”这个数字说起:为什么这个节点值得单独拎出来聊“A Game of Thrones(86)”这个标题,第一次看到的人大概率会愣一下——括号里的86是什么意思?是第86章?第86集?还是某个版本编号?如果你追过这套作…

2026/10/16 21:56:13 阅读更多 →
linear-cli 退出码全解析:0/2/3/4/5 各代表什么,脚本如何精准判断失败原因?

linear-cli 退出码全解析:0/2/3/4/5 各代表什么,脚本如何精准判断失败原因?

【免费下载链接】linear-cli linear without leaving the command line: list, start, and create PRs for linear issues. agent friendly. 项目地址: https://gitcode.com/gh_mirrors/lin/linear-cli 点击查看 免费下载 linear-cli 是一个让你不离开命令行就能管…

2026/10/16 21:56:13 阅读更多 →
STK 11自带案例从入门到改造:卫星仿真与覆盖分析实战

STK 11自带案例从入门到改造:卫星仿真与覆盖分析实战

简介:STK11(System Tool Kit 11)是由AGI推出的空间系统模拟分析软件,在航天、国防、通信等领域应用广泛。这份压缩包内含其自带的应用案例,适合刚接触STK11的工程师与在校学生通过实例快速上手。包内共396个文件&#…

2026/10/16 21:56:13 阅读更多 →
15 个真实数据案例、119 张规范图表:High-Stakes Analytics  Decision Lab 案例组合阅读指南

15 个真实数据案例、119 张规范图表:High-Stakes Analytics Decision Lab 案例组合阅读指南

【免费下载链接】high-stakes-analytics-decision-lab A platform-neutral analytical Skill that profiles messy data, selects case-adaptive methods, and produces source-backed visual reports for high-stakes decisions. 项目地址: https://gitcode.com/gh…

2026/10/16 21:56:13 阅读更多 →
cua是什么意思?从网络拟声词到IBM界面规范的跨界解读

cua是什么意思?从网络拟声词到IBM界面规范的跨界解读

上周朋友给我发来一张游戏截图,配了一行字:“cua cua cua,直接秒了。”我问她那是什么意思,她回了一个“这你都看不懂?”的表情包。坦白说,作为常年混在社媒和内容行业的人,对看不懂的网络黑话应…

2026/10/16 21:55:13 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* 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 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →