使用Netty

时间:2015-12-03 03:15:57

标签: netty http2

我试图在Netty中开始使用HTTP / 2。我已经尝试了"hello world" example,它按预期工作。在示例中,管道看起来像这样:

服务器:

  • SslHandler
  • ApplicationProtocolNegotiationHandler
    • Http2ConnectionHandler

客户端:

  • SslHandler
  • ApplicationProtocolNegotiationHandler
    • HttpToHttp2ConnectionHandler
    • SimpleChannelInboundHandler<Http2Settings>(在第一个SETTINGS框架后从管道中删除)
    • SimpleChannelInboundHandler<FullHttpResponse>

我尝试 - 主要是出于教育目的 - 建立一个不进行HTTP到HTTP / 2转换的客户端(即我试图写一些东西&#34;更接近对金属&#34;)。我的服务器看起来几乎与示例服务器完全相同,但我的客户端管道看起来几乎与服务器管道完全相同:

  • SslHandler
  • ApplicationProtocolNegotiationHandler
    • Http2ConnectionHandler

我遇到的麻烦是客户序言似乎没有按预期发送:

Dec 02, 2015 9:37:19 PM io.netty.handler.codec.http2.Http2ConnectionHandler processGoAwayWriteResult SEVERE: Sending GOAWAY failed: lastStreamId '0', errorCode '1', debugData 'HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 000000040000000000'. Forcing shutdown of the connection. javax.net.ssl.SSLException: SSLEngine closed already

这里要提到的另一件事是我通过TLS直接寻找HTTP / 2,而不是尝试进行明文升级。

我已经阅读了所有&#34; hello world&#34;示例代码和所有基类,但我没有看到客户端在示例中发送其前言的位置。我怀疑这与示例中的自毁设置处理程序有关,但是除了以后控制非前言流量的时间之外,它无法看到其他功能。

我还尝试使用server(boolean) Http2ConnectionHandler中的Builder方法,但没有取得多大成功。我错过了一些明显的东西吗我应该如何设置我的客户端管道(或者我应该在设置管道之后采取哪些步骤)来管理前言交换?

或者,这可能会发生,因为客户端正在尝试在前言交换发生之前发送GOAWAY(因为我尝试做的所有事情都是连接)。如果是这样的话,那么&#34;对&#34;是什么?打开连接并保持打开的方式(如果只有足够长的时间让前言交换发生)?自我毁灭的处理程序是&#34;期望&#34;接近?

编辑:为了澄清,我没有故意发送GOAWAY。如果这是正在发生的事情,它本身就是一个谜。

非常感谢!

1 个答案:

答案 0 :(得分:2)

我正在疯狂吃药。使用.server(false)构建客户端连接处理程序使一切按预期工作;我以前尝试过时一定是在运行旧代码。为噪音道歉!

编辑:更具体地说,问题似乎是我试图在我的连接处理程序构建器的.server(false)方法中执行build0。看来这是不允许的(或者,至少,不起作用),但我还不确定原因。从实际使用构建器的东西中调用.server(false)会产生预期的结果。