Netty的深入浅出--21.gRPC双向流数据通信
继续上一章的内容,客户端请求是一个流对象,服务端响应一个集合
客服端流式请求,服务端响应一个集合:
具体方法分析:
onNext():这里面和之前的方法有点不同,在之前onNext()是用来返回给客户端响应的数据,而在现在是客户端发送流式请求之后,onNext()方法是接收客户端发送过来的流式请求;每接收一个数据,它就会被调用一次。
onError():返回错误信息;
onCompleted():这个和之前不同,在之前两个信息传递的时候,该方法只是一个起到通知的作用,而在这里它是返回给客户端响应数据的方法。
客户端相比服务端,其编写难度更大。
客户端接收服务端的响应:
我们仔细看一下,我们想获取getStudentWrapper()方法对象,发现根本就没有。
因为客户端向服务端发送请求,在这里你会发现我们无法使用blockingStub的获取相关方法,因为我们客户端发送流式请求的时候,gRPC不支持使用同步方式获得对象,要求使用异步获取相应对象
在gRPC中存在一个方法,使用异步的方式来发送流式请求
现在你在写的时候,发现异步的stub竟然三种方式都可以;
总结来讲就是,客户端不管是不是以流式的方式发送请求,都可以采用异步来获取对象;
但是如果是流式的方式发送请求,都只能用异步来获取对象。
发送请求信息;
这里和之前又有点不同,之前请求信息发送完之后,就没有然后了。而异步不同, 你不行调用onCompleted()方法通知。
注释掉之前那个打印调用:
启动服务器(服务器使用的是上一章提到的):
启动客户端(发现没有结果):
原因主要是因为异步的原因:
数据还没来的急发送出去,就已经执行了Oncompleted()方法;
我们让程序休眠一段时间
启动服务器
启动客户端
还有最后一种形式:两端都是以流式方法发送请求和响应
定义两个流式请求参数
编译器生成代码
拷贝代码:
gRPC服务代码:
服务端代码编写:
客户端代码编写:
注释掉之前的代码
打印服务端发送过来的信息
客户端向服务端发送流式请求:
运行之后
到现在为止gRPC的四种方式以及基本上写完了,对于gRPC也基本上学完了,大家注意是要理解它的四种方法以及使用场景,然后跟thrift进行对比。
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加除了各种控件外,文章正文的字数;(2)提升标题与正文的相关性。
CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
317-006: 第一个例子根本就不是内存可见性的问题,是由于jit即时编译器将代码优化了,你再运行时加上jvm参数-Xint,只执行解释器,就不会一直执行下去。
都是报错快CV吧: 好像第二条server和client说反了,能感觉到一起就好,就是说只能发一条收一条,不能一直发