连接错误 io.netty.handler.codec.http2.Http2Exception: HTTP/2客户端引导字符串丢失或损坏。接收到的字节的十六进制转储:

19

在处理Grpc双向流时,当我尝试运行grpc时,出现以下错误:

Connection Error
io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:82)
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.readClientPrefaceString(Http2ConnectionHandler.java:322)
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:263)
    at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:445)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeLast(ByteToMessageDecoder.java:382)
    at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:286)
    at io.netty.handler.codec.http2.Http2ConnectionHandler.channelInactive(Http2ConnectionHandler.java:421)
    at io.grpc.netty.NettyServerHandler.channelInactive(NettyServerHandler.java:227)
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelInactiveNow(ChannelHandlerInvokerUtil.java:56)
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelInactive(DefaultChannelHandlerInvoker.java:92)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:135)
    at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:928)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:674)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:339)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:356)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)

可能出了什么问题?


3
你已经得到了回答,为什么不表示感激并接受这个答案呢? - Abhijit Sarkar
2个回答

34

需要注意的一点是,NettyServerBuilderManagedChannelBuilder在明文方面的默认行为有所不同。

如果您没有在服务器上启用TLS(例如,在服务器构建器上调用sslContext()useTransportSecurity()),那么您必须在连接到服务器的任何通道上调用ManagedChannelBuilder.usePlaintext(true)

换句话说,服务器默认使用明文是可以的,但是对于通道,您需要调用usePlaintext()才能与明文服务器通信。如果没有这样做,您将会得到这个确切的异常信息:HTTP/2 client preface string missing or corrupt(虽然,在我的情况下,其后会跟随一串特定的字节)。


7
客户端和服务器之间存在不一致。通常是因为其中一个使用明文而另一个使用TLS。但在某些环境下,也可能是由于HTTP/1与HTTP/2的差异引起的。
然而,接收到的字节的十六进制转储为空,因此没有足够的信息来更精确地诊断问题。尽管如此,我从未在看到此故障时见过字节为空的情况。

我看到这是一个较旧的答案,但我遇到了类似的问题并且非常困惑。你有什么想法吗?我正在遵循这两个答案,但没有运气:https://dev59.com/q672oIgBc1ULPQZFvV08是否有一种使用C(Arduino项目)创建明文通道的方法? - user4538583
这让我明白了Postman上的问题。我之前使用过一个有效的gRPC连接,然后在Postman中复制了该连接。但一旦我尝试连接到本地的gRPC时,就出现了问题。我不得不从头开始创建一个新的请求,然后才能使其正常工作。 - But I'm Not A Wrapper Class

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接