核心区别在于边界识别方式、安全控制粒度和适用数据类型:Text协议依赖换行符切分,限制原始数据传输且易受OOM攻击;自定义协议通过自定义帧结构实现无损二进制传输、内置校验与防护,兼顾健壮性与扩展性。

核心区别不在“能不能用”,而在于边界识别方式、安全控制粒度和适用数据类型。Text协议是开箱即用的简单方案,自定义协议则是为特定场景量身设计的可控方案。
边界识别机制不同
Text协议靠换行符(\n 或 \r\n)切分消息,框架自动扫描缓冲区找换行位置。这导致:
- 无法传输含换行符的原始数据(如JSON字符串、日志片段、加密密文)
- 遇到超长无换行数据时,可能持续扩容内存直至崩溃(需手动配 max_package_size + strict_mode 才能防护)
- 粘包/半包问题由框架隐式处理,开发者不可见也不可控
自定义协议完全掌握帧结构
你决定怎么标记一帧的开始和结束。常见做法是:
- 固定长度头(如前2或4字节存payload长度),后续按长度读取
- 自定义起始标记 + 长度字段 + 校验和 + 结束标记
- 在 input() 方法中返回完整帧长度(含头部),Workerman据此精准切帧
这样就能无损传输任意二进制数据,天然防粘包,也便于做校验、加解密、压缩等扩展。
安全与健壮性差异明显
Text协议默认不设防——不校验单行长度、不限缓冲上限、不验证完整性。必须显式配置才能避免OOM攻击。
自定义协议从设计之初就可内置防护:
- 长度字段本身是第一道校验(比如最大只允许 64KB)
- 可在 input() 中直接丢弃超长/非法帧,不缓存、不断连、不扩容
- 支持添加 CRC、MD5 或签名字段,防止篡改
调试与兼容性取舍
Text协议优势明显:支持 telnet 直连调试、开发快、客户端易实现(比如 shell 脚本 echo "xxx" | nc)。
自定义协议调试稍复杂,需配套工具或客户端库,但换来的是生产环境的稳定性和扩展空间——尤其在物联网上报、音视频分片、RPC通信等场景中,这是必要投入。

















