使用 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 实现支持服务器发送事件的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#还有这种好事!netty自带http2的编码解码器framecodec