iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

gRPC通訊框架認識與實作系列 第 23

gRPC通訊框架認識與實作【Day 23】

  • 分享至 

  • xImage
  •  

最後一組,我們要來做client stream對上server stream,也就是client多發對server多發,這種情況常見在聊天室的情境中。所以我們就開始吧!
首先一樣在.proto檔新增service:

service IronManService{
  rpc IronMan01(IronManRequest01) returns (IronManResponse01) {}
  rpc IronMan02(IronManRequest02) returns (IronManResponse02) {}
  rpc Client2Servers(IronManRequest01) returns (stream IronManResponse01) {}
  rpc Clients2Server(stream IronManRequest01) returns (IronManResponse01) {}
  rpc Clients2Servers(stream IronManRequest01) returns (stream IronManResponse01) {}
}

然後我們在server層override一個新的method clients2server2,
由於是多次的回傳以及多次的監聽,因此我們一樣要選擇使用樣板程式來實作,所以我們寫上:

@Override
public StreamObserver<IronManProto.IronManRequest01> clients2Servers(final StreamObserver<IronManProto.IronManResponse01> responseObserver) {
    return new StreamObserver<IronManProto.IronManRequest01>() {
        @Override
        public void onNext(IronManProto.IronManRequest01 value) {
            IronManProto.IronManResponse01.Builder builder = IronManProto.IronManResponse01.newBuilder();
            builder.setResult("我是server端,我收到Client的訊息: " + value.getName() + " 以及 " + value.getAge());
            IronManProto.IronManResponse01 ironManResponse01 = builder.build();

            responseObserver.onNext(ironManResponse01);
        }

        @Override
        public void onError(Throwable t) {

        }

        @Override
        public void onCompleted() {
            System.out.println("接收完所有Client的request");
            responseObserver.onCompleted();
        }
    };
}

一樣是在OnNext()中準備接收每一次client端傳來的資料,然後每收到一次資料就回傳一個response的內容給client端,注意我們的onCompleted()不能寫在這邊,因為我們每收到一次request就要回傳,如果把oncompleted()寫在這裡,那就不能達成多發的server。
所以我們這次的onCompleted()必須寫在樣板程式的onCompleted()裡面,這樣就完成我們server的設計了。


上一篇
gRPC通訊框架認識與實作【Day 22】
下一篇
gRPC通訊框架認識與實作【Day 24】
系列文
gRPC通訊框架認識與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言