我们在.proto文件中再增加一个方法,这回这个方法的返回值被 stream 关键字修饰
1 | rpc methodResultStream(Request) returns (stream Result){} |
清缓存,重新编译
3.1.服务端
实现刚刚新加的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Override public void methodResultStream(Request request, StreamObserver<Result> responseObserver) { System.out.print( "收到了请求 \n" ); Result result = Result.newBuilder().setResult1( "result1" ).setResult2( "result2" ).build(); responseObserver.onNext(result); responseObserver.onNext(result); try { Thread.sleep( 2000 ); } catch (Exception ex){} responseObserver.onNext(result); responseObserver.onCompleted(); } |
这里跟普通的差不多,只是我们返回了三次结果
1 2 3 4 5 6 7 | responseObserver.onNext(result); responseObserver.onNext(result); try { Thread.sleep( 2000 ); } catch (Exception ex){} responseObserver.onNext(result); |
3.2.客户端
没啥好加的了,直接上测试
1 2 3 4 5 6 7 8 9 10 11 | @Test public void contextLoads3() { Request request = Request.newBuilder().setRequest1( "test1" ).setRequest2( "test2" ).build(); Iterator<Result> result = javaGrpcClient.run(o -> o.methodResultStream(request)); result.forEachRemaining(o -> { System.out.print( "返回了结果 \n" ); }); System.out.print( "结束 \n" ); } |
返回流请求是同步的,所以要调同步的方法,返回了一个迭代器
1 | Iterator<Result> result = javaGrpcClient.run(o -> o.methodResultStream(request)); |
迭代器中有服务端的所有返回结果
1 2 3 4 | result.forEachRemaining(o -> { System.out.print( "返回了结果 \n" ); }); |