2017-04-10 102 views
0

我在GRPC客户端上使用GRPC版本:1.1.2 & JDK版本:1.8在连接到NodeJS服务器的GRPC客户端上。 Java客户端能够正常连接,但当我断开与客户端的连接时,我总是在服务器端看到下面的异常。使用GRPC时SSL解密错误

异常(仅在服务器上)

E0410 15:03:19.674531000 140735121084416 ssl_transport_security.c:439] SSL_read returned 0 unexpectedly. 
E0410 15:03:19.674829000 140735121084416 secure_endpoint.c:185]  Decryption error: TSI_INTERNAL_ERROR 

我关闭通过以下调用的GRPC的Java连接:

channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); //channel is ManagedChannel 

我应该做这个之前被清理的任何其他资源打电话还是应该使用备用机制彻底断开与服务器的连接?

编辑 我注意到,我得到同样的错误,当我尝试以下方法,以及:

channel.shutdown(); 

我在Mac上使用OpenSSL - 我记得更改默认的Mac版(OpenSSL的0.9.8zh 2016年1月14日)。

在GRPC

result = tsi_frame_protector_unprotect(ep->protector, message_bytes, 
              &processed_message_size, cur, 
              &unprotected_buffer_size_written); 
     gpr_mu_unlock(&ep->protector_mu); 
     if (result != TSI_OK) { 
     gpr_log(GPR_ERROR, "Decryption error: %s", 
       tsi_result_to_string(result)); 
     break; 
     } 

回答

1

ManagedChannel.shutdown() secure_endpoint.c指示没有更多新的RPC应启动服务器。所有现有的RPC,特别是流式RPC都将继续运行。一旦完成所有这些RPC,ManagedChannel将关闭所有底层连接,并且通道将进入终止状态。

ManagedChannel被设计为类似于ExecutorService。有一两件事可以做,以确保你真的是正常关闭是在一个循环中调用awaitTermination:

while (!channel.awaitTermination(5, TimeUnit.Second)) { 
    System.err.println("Still not terminated."); 
} 
+0

将尝试 - 感谢 –

+0

感谢 - 有来自客户端的整理过的双向流的清洁方法时,客户需要断开连接? –

+0

或者是从客户端关闭频道的唯一选项,并且服务器必须检测客户端断开连接并关闭流? –