当前位置: 首页 > 知识库问答 >
问题:

用Netty发送HTTP/2客户端前言

贺季
2023-03-14

我正在尝试在Netty中开始使用HTTP/2。我尝试了“hello world”示例,它按预期工作。在示例中,管道如下所示:

服务器:

  • SslHandler
  • 应用程序协议协商处理程序
    • Http2ConnectionHandler

    客户:

    • SslHandler
    • 应用程序协议协商处理程序
      • HttpToHttp2ConnectionHandler
      • SimpleChannelInboundHandler

      我主要出于教育目的,尝试构建一个不进行HTTP到HTTP/2转换的客户端(即,我尝试编写一些“更接近金属”的东西)。我的服务器看起来几乎与示例服务器一模一样,但我的客户端管道看起来几乎与服务器管道一模一样:

      • SslHandler
      • 应用程序协议协商处理程序
        • Http2ConnectionHandler

        我遇到的问题是,客户前言似乎没有按预期发送:

        12月02, 2015 9:37:19日下午io.netty.handler.codec.http2. Http2ConnectionHandler进程GoAwayWriteResult SEVERE:发送GOAway失败:lastStreamId'0',errorCode'1',debug Data'HTTP/2客户端前言字符串丢失或损坏。接收字节的十六进制转储:000000040000000000。强制关闭连接。javax.net.ssl.SSLException:SSLEngine已关闭

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

        我已经阅读了所有的“hello world”示例代码和所有的基类,但我没有看到客户机在示例中发送前言的地方。我怀疑这与示例中的自毁设置处理程序有关,但看不出它除了稍后控制非序通信的定时之外还能做什么。

        我还尝试过在Http2ConnectionHandler中使用server(boolean)方法,但没有成功。我错过了什么明显的东西吗?我应该如何设置客户端管道(或者设置管道后应该采取什么步骤)来管理preface exchange?

        或者,这可能是因为客户机试图在交换前言之前发送一个GOAWAY(因为我只想连接)。如果是这样的话,那么打开连接并保持其打开的“正确”方式是什么(如果只需要足够长的时间就可以进行前言交换)?自毁处理程序是“预期”方法吗?

        编辑:澄清一下,我不是故意发送GOAWAY。如果这就是正在发生的事情,那么它本身就是一个谜。

        非常感谢!


共有1个答案

蔡晨
2023-03-14

我正在服用疯狂的药片。使用构建客户端连接处理程序。服务器(false)使一切按预期工作;我以前试过的时候一定是在运行旧代码。抱歉吵闹!

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

 类似资料:
  • 我试图理解netty http客户端连接池。如果是NIO和异步的,那么这个连接池的意义是什么? 例如:如果服务A调用服务B,并且服务A的客户端连接池计数设置为50,那么这是否意味着我们最多只能发出50个并行请求? 更新: 我在3.5秒内完成了所有通话。理想情况下,有一个连接,我应该在150秒内完成。

  • 我使用请求一组URL。大多数URL属于相同的主机。似乎会为每个URL创建一个全新的TCP连接,即使已经为上一个URL建立了到主机的连接。当数百个连接同时建立时,一些服务器会丢弃新的连接或开始缓慢响应。 代码示例: 在日志中,我看到同一个远程主机的本地端口不同,活动和非活动连接的总和远远高于不同主机的数量。这就是为什么我认为没有重用已经建立的连接。 是否可以使用HTTP客户端通过与主机的同一TCP连

  • 在构建Retor Netty应用程序时,我得到了两个相似的指标。但是它们之间到底有什么区别呢? vs. 我不知道他们在测量响应时间的方式/位置上有什么不同。哪种方法测量的时间更长并不一致。 Http客户端指标测量时间更长 ReactorNetty指标延长了时间

  • 如何在基于网络的 HTTP 客户端中重试 HTTP 请求? 请考虑以下处理程序,如果收到 HTTP 响应代码 503,它将尝试在 1 秒后重试 HTTP 请求: 在本例中,当我写入通道时,管道中的其他处理程序会看到HttpObjects,但实际上不会再次执行HttpRequest——只接收到一个HttpResponse。 我认为在这种情况下我只是滥用了 Channel,我需要创建一个新的通道(表示

  • 我使用的是Netty 3.9.5,我有一个简单的客户机-服务器设置,我从http://en.wikipedia.org/wiki/Netty_(软件)#Netty\u TCP\u示例。我扩展了这个示例,将Java search plan对象从客户端发送到服务器。在这个网站上跟踪用户的帮助下,我已经能够让这个程序按预期运行。 现在,我想让我的读卡器/服务器程序同时接受多个客户端。我想我会使用下面列出

  • 我正在尝试使用Netty编写RTSP服务器。 现在,客户端发送请求 我想发回以下回复 我应该使用什么来构造http响应。我应该使用HttpResponse还是只使用普通字节数组并将其转换为ByteBuf? 我使用的Netty版本是4.1.5 提前谢谢。