首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于Java的Grpc服务器和基于C#的客户端传输失败错误

使用基于Java的Grpc服务器和基于C#的客户端传输失败错误
EN

Stack Overflow用户
提问于 2020-04-14 12:47:23
回答 2查看 3.8K关注 0票数 5

我正在开发一个基于java的Grpc服务器,它使用spring (2.2.2)和grpc spring starter库。我的客户机应用程序是一个C#应用程序(netcoreapp3.1)。这两个应用程序都在我的笔记本上运行,用于这个测试。

这是我的原始文件

代码语言:javascript
复制
syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.honeywell.EOM.SystemAPI.webapi.web.grpc.service";
//option java_outer_classname = "TestProto";

service Simple {
    rpc GetData (Empty) returns (Data) {
    }
}

message Empty {

}

message Data {
    string name = 1;
}

这是服务代码

代码语言:javascript
复制
@GrpcService
public class TestService extends SimpleGrpc.SimpleImplBase {
    @Override
    public void getData(Empty request, StreamObserver<Data> responseObserver) {
        Data data = Data.newBuilder().setName("Somename").build();
        responseObserver.onNext(data);
        responseObserver.onCompleted();
    }
}

我首先使用这个工具工具测试了服务器。

该服务在此客户端工具中运行良好。

然而,当我使用C#客户端进行测试时,我得到了这个错误

代码语言:javascript
复制
io.grpc.netty.shaded.io.grpc.netty.NettyServerTransport notifyTerminated
INFO: Transport failed
io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 16030100b6010000b203035e95b0402c6320969d3d5fba04
    at io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:103)
    at io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.readClientPrefaceString(Http2ConnectionHandler.java:306)
    at io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:239)
    at io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:438)
    at io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
    at io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
    at io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
    at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
    at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
    at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
    at io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422)
    at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
    at io.grpc.netty.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
    at io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931)
    at io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700)
    at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635)
    at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552)
    at io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514)
    at io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
    at io.grpc.netty.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.grpc.netty.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:834)

C#客户端代码在这里

代码语言:javascript
复制
using var channel = GrpcChannel.ForAddress("https://localhost:9090");
var client = new Simple.SimpleClient(channel);
var reply = client.GetData(new Empty { });

我做错了什么?这是一个公开的缺陷吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-15 17:05:51

正如的答案所述,客户端确实在使用TLS。

当与不安全(非TLS)服务器通信时(从.NET Core3.1起),gRPC的.NET核心客户端需要额外的配置。

代码语言:javascript
复制
// This switch must be set before creating the GrpcChannel/HttpClient.
AppContext.SetSwitch(
    "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

using var channel = GrpcChannel.ForAddress("http://localhost:9090");
var client = new Simple.SimpleClient(channel);
var reply = client.GetData(new Empty { });
票数 1
EN

Stack Overflow用户

发布于 2020-04-14 16:24:54

错误消息报告接收的字节(以十六进制表示):

16030100b6010000b203035e95b0402c6320969d3d5fba04

三个起始字节的160301看起来像一个TLS握手。服务器可能处于纯文本模式,而客户端正在使用TLS。

要在客户端上使用纯文本,请使用"http":

代码语言:javascript
复制
using var channel = GrpcChannel.ForAddress("http://localhost:9090");

编辑:这个答案的代码示例被破坏了;它没有正确地启用纯文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61208080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档