gRPC Java客户端无法连接.NET服务器问题咨询
解决方案
问题2:修改.NET服务器以支持明文通信
ASP.NET 7 默认的 gRPC 服务依赖 HTTPS(HTTP/2 加密传输),要开启明文 HTTP/2 通信,需在 Program.cs 中配置 Kestrel 服务器:
var builder = WebApplication.CreateBuilder(args); // 配置 Kestrel 支持 HTTP/2 明文通信 builder.WebHost.ConfigureKestrel(options => { // 监听明文端口(例如5000),强制使用 HTTP/2 options.ListenAnyIP(5000, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; }); // 保留 HTTPS 端口(可选,如需同时支持加密通信) options.ListenAnyIP(5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; listenOptions.UseHttps(); }); }); // 添加 gRPC 服务 builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务端点 app.MapGrpcService<YourGrpcServiceImpl>(); app.Run();
配置完成后,服务器会同时监听明文端口(5000)和 HTTPS 端口(5001),.NET 客户端无需修改即可继续连接,Java 客户端也可通过明文端口连接。
问题1:实现可连接该.NET服务器的Java客户端
根据服务器的通信模式,分两种情况配置:
情况1:服务器已开启明文通信
直接使用 usePlaintext() 配置 Channel,指定明文端口即可:
// 创建明文通信的 Channel ManagedChannel channel = ManagedChannelBuilder.forAddress("your-server-ip", 5000) .usePlaintext() .build(); // 创建 gRPC Stub 并调用服务 YourServiceGrpc.YourServiceBlockingStub stub = YourServiceGrpc.newBlockingStub(channel); YourResponse response = stub.yourRpcMethod(YourRequest.newBuilder().build()); // 使用完成后关闭 Channel channel.shutdown();
情况2:服务器保留HTTPS加密通信
若服务器仍使用 HTTPS,Java 客户端抛出 SSLHandshakeException 通常是因为服务器证书不被 Java 默认信任(比如自签名证书)。需自定义 SSL 上下文,将服务器证书加入信任列表:
// 加载服务器证书(假设证书文件为 server.crt) InputStream certStream = new FileInputStream("path/to/server.crt"); CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); X509Certificate serverCert = (X509Certificate) certFactory.generateCertificate(certStream); // 构建信任库 KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); trustStore.setCertificateEntry("server-cert", serverCert); // 初始化信任管理器 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); // 创建自定义 SSL 上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); // 构建支持自定义证书的 Channel ManagedChannel channel = ManagedChannelBuilder.forAddress("your-server-ip", 5001) .sslContext(sslContext) .build(); // 后续调用服务逻辑同上 YourServiceGrpc.YourServiceBlockingStub stub = YourServiceGrpc.newBlockingStub(channel); // ...
内容的提问来源于stack exchange,提问作者Johann Heinzelreiter
相关产品推荐
相关产品推荐

