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

问题描述 投票:0回答:3

在 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)

可能是什么问题?

grpc grpc-java
3个回答
35
投票

需要注意的一件事是

NettyServerBuilder
ManagedChannelBuilder
w/r/t 明文的默认行为之间的差异。

如果您未在服务器上启用 TLS(例如,通过在服务器构建器上调用

sslContext()
useTransportSecurity()
),那么您 必须 在连接到服务器的任何通道上调用
ManagedChannelBuilder.usePlaintext(true)

因此,换句话说,服务器默认为明文就可以了,但是对于通道,您需要调用

usePlaintext()
以允许与明文服务器进行通信。如果没有,您将得到这个确切的
HTTP/2 client preface string missing or corrupt
异常(尽管在我的例子中,十六进制转储后面有一个特定的字节字符串)。


9
投票

客户端和服务器不同意。通常这是因为一个是明文,另一个使用 TLS。但也可能是由于某些环境中的 HTTP/1 与 HTTP/2 造成的。

Hex dump for received bytes
是空的,因此没有足够的信息来更准确地诊断问题。不过,当我看到此失败时,我从未见过字节为空。


0
投票

在本地运行服务时,我们需要禁用 TLS。

© www.soinside.com 2019 - 2024. All rights reserved.