使用 Netty HTTP2 实现支持服务器发送事件

Posted

技术标签:

【中文标题】使用 Netty HTTP2 实现支持服务器发送事件【英文标题】:Supporting Server Sent Events with Netty HTTP2 implementation 【发布时间】:2015-12-04 15:22:28 【问题描述】:

我使用的是 Netty 4.1-Beta6 版本。

我想支持 HTTP2 服务器应该能够在现有连接上将事件推送到 HTTP2 客户端的用例 - 这可能是来自云端的警报或计时器事件,需要传播到客户端。

    我正在考虑使用“服务器发送事件”功能 - 是否可以在 Netty 中使用 HTTP2 执行此操作,如果可以,如何操作?我是否应该通过发送将“最终帧”标志设置为 false 的数据帧来保持 http2 流打开?当我尝试这个时,我观察到内容被缓冲了。我写的时候数据框没有到达客户端。我正在使用 DefaultHttp2Encoder。我也尝试将“Transfer-Encoding”标头设置为“chunked”。

    相关问题 - 一旦流处于“打开”状态,HTTP2 是否允许双向数据帧?这个想法是服务器应该能够从客户端询问数据,并且客户端应该能够用同一流中的数据进行响应(一旦建立流,客户端/服务器角色的反转)。这可能吗?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

我和 Netty 玩得更多了。这是我对上述 2 个问题的发现。

    客户端和服务器都可以通过在发送标头/数据帧时将“endOfStream”发送为假来保持流处于“打开”状态。为了避免在服务器端缓冲数据,我不得不调用 flowController.writePendingBytes(),然后调用 ChannelHandlerContext.flush()'。

我已经在这里上传了我的示例 - https://github.com/skssfo/http2

    是的,客户端和服务器可以保持流打开并相互独立地发送数据帧。

我是第一次玩Netty,很酷。干得好 Netty 团队!

【讨论】:

以上是关于使用 Netty HTTP2 实现支持服务器发送事件的主要内容,如果未能解决你的问题,请参考以下文章

netty系列之:netty对http2消息的封装

#yyds干货盘点#还有这种好事!netty自带http2的编码解码器framecodec

netty系列之:让TLS支持http2

Netty HTTP2 帧转发/代理 - 管道配置问题

如何使用 h2load 为基于 Netty 的 http2 服务器做基准测试?

IOS推送http2使用netty服务启动异常