继续上一章的内容,客户端请求是一个流对象,服务端响应一个集合

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信

 客服端流式请求,服务端响应一个集合:

具体方法分析:

onNext():这里面和之前的方法有点不同,在之前onNext()是用来返回给客户端响应的数据,而在现在是客户端发送流式请求之后,onNext()方法是接收客户端发送过来的流式请求;每接收一个数据,它就会被调用一次。

onError():返回错误信息;

onCompleted():这个和之前不同,在之前两个信息传递的时候,该方法只是一个起到通知的作用,而在这里它是返回给客户端响应数据的方法。

grpc 双向认证 grpc 双向通信_grpc 双向认证_02

 客户端相比服务端,其编写难度更大。

客户端接收服务端的响应:

grpc 双向认证 grpc 双向通信_客户端_03

 我们仔细看一下,我们想获取getStudentWrapper()方法对象,发现根本就没有。

grpc 双向认证 grpc 双向通信_Netty的深入浅出_04

因为客户端向服务端发送请求,在这里你会发现我们无法使用blockingStub的获取相关方法,因为我们客户端发送流式请求的时候,gRPC不支持使用同步方式获得对象,要求使用异步获取相应对象 

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信_05

在gRPC中存在一个方法,使用异步的方式来发送流式请求

grpc 双向认证 grpc 双向通信_Netty的深入浅出_06

现在你在写的时候,发现异步的stub竟然三种方式都可以;

总结来讲就是,客户端不管是不是以流式的方式发送请求,都可以采用异步来获取对象;

但是如果是流式的方式发送请求,都只能用异步来获取对象。

grpc 双向认证 grpc 双向通信_grpc 双向认证_07

 发送请求信息;

这里和之前又有点不同,之前请求信息发送完之后,就没有然后了。而异步不同, 你不行调用onCompleted()方法通知。

grpc 双向认证 grpc 双向通信_grpc 双向认证_08

注释掉之前那个打印调用:

grpc 双向认证 grpc 双向通信_客户端_09

启动服务器(服务器使用的是上一章提到的):

grpc 双向认证 grpc 双向通信_Netty的深入浅出_10

 启动客户端(发现没有结果):

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信_11

原因主要是因为异步的原因:

数据还没来的急发送出去,就已经执行了Oncompleted()方法;

我们让程序休眠一段时间

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信_12

启动服务器

grpc 双向认证 grpc 双向通信_grpc 双向认证_13

启动客户端

grpc 双向认证 grpc 双向通信_grpc 双向认证_14

 

grpc 双向认证 grpc 双向通信_grpc 双向认证_15

 

还有最后一种形式:两端都是以流式方法发送请求和响应

定义两个流式请求参数 

grpc 双向认证 grpc 双向通信_grpc 双向认证_16

grpc 双向认证 grpc 双向通信_服务端_17

 

编译器生成代码 

grpc 双向认证 grpc 双向通信_Netty的深入浅出_18

拷贝代码:

grpc 双向认证 grpc 双向通信_客户端_19

 

grpc 双向认证 grpc 双向通信_grpc 双向认证_20

 

gRPC服务代码:

grpc 双向认证 grpc 双向通信_服务端_21

 

服务端代码编写:

grpc 双向认证 grpc 双向通信_grpc 双向认证_22

 

 客户端代码编写:

注释掉之前的代码

grpc 双向认证 grpc 双向通信_客户端_23

打印服务端发送过来的信息

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信_24

 

客户端向服务端发送流式请求:

grpc 双向认证 grpc 双向通信_gRPC双向流数据通信_25

 

运行之后

grpc 双向认证 grpc 双向通信_服务端_26

 

grpc 双向认证 grpc 双向通信_Netty的深入浅出_27

 

到现在为止gRPC的四种方式以及基本上写完了,对于gRPC也基本上学完了,大家注意是要理解它的四种方法以及使用场景,然后跟thrift进行对比。