【发布时间】:2016-03-07 13:12:37
【问题描述】:
我正在尝试在 Netty 中开始使用 HTTP/2。我试过"hello world" example,它按预期工作。在示例中,管道如下所示:
服务器:
SslHandler-
ApplicationProtocolNegotiationHandlerHttp2ConnectionHandler
客户:
SslHandler-
ApplicationProtocolNegotiationHandlerHttpToHttp2ConnectionHandler-
SimpleChannelInboundHandler<Http2Settings>(在第一个SETTINGS帧之后从管道中删除) SimpleChannelInboundHandler<FullHttpResponse>
我正在尝试(主要是出于教育目的)构建一个不进行 HTTP 到 HTTP/2 转换的客户端(即,我正在尝试编写一些“更接近金属”的东西)。我的服务器看起来几乎与示例服务器一模一样,但我的客户端管道看起来几乎与服务器管道一模一样:
SslHandler-
ApplicationProtocolNegotiationHandlerHttp2ConnectionHandler
我遇到的麻烦是客户端序言似乎没有按预期发送:
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,而不是尝试进行明文升级。
我已经阅读了所有“hello world”示例代码和所有基类,但我没有看到客户端在示例中将其前言发送到何处。我怀疑这与示例中的自毁设置处理程序有关,但除了稍后控制非序言流量的时间之外,看不到它的作用。
我也尝试过在Http2ConnectionHandlerBuilder 中使用server(boolean) 方法,但没有取得多大成功。我错过了一些明显的东西吗?我应该如何设置我的客户端管道(或者在设置我的管道之后我应该采取哪些步骤)来管理序言交换?
另外,这可能是因为客户端试图在前言交换发生之前发送GOAWAY(因为我要做的只是连接)。但是,如果是这种情况,那么打开连接并将其保持打开状态的“正确”方式是什么(只要足够长的时间让前言交换发生)?自毁处理程序是“预期”的方法吗?
编辑:澄清一下,我不是故意发送GOAWAY。如果这是正在发生的事情,那它本身就是一个谜。
非常感谢!
【问题讨论】: