補班日後的第一個上班日,我覺得我的靈魂要被抽乾了...
(內心OS:假就已經夠少了還要補班,我是不是該考慮移民啊
接下來我們要開始製作client多發對server單發,首先要製作的是server端。
請一樣在.proto中新增一組Clients2Server
service IronManService{
rpc IronMan01(IronManRequest01) returns (IronManResponse01) {}
rpc IronMan02(IronManRequest02) returns (IronManResponse02) {}
rpc Client2Servers(IronManRequest01) returns (stream IronManResponse01) {}
rpc Clients2Server(stream IronManRequest01) returns (IronManResponse01) {}
}
然後一樣讓protobuf重新整理並生成對應的function,然後在gRPCServer中新增實作Clients2Server這個function。
由於我們這次是由client發送多條訊息給server,因此在server這邊就要使用StreamObserver的樣板程式監聽client端發送過來的request,之後再進行多次的response回傳。
所以我們在override的時候就要直接在return時做出樣板程式:
@Override
public StreamObserver<IronManProto.IronManRequest01> clients2Server(final StreamObserver<IronManProto.IronManResponse01> responseObserver) {
return new StreamObserver<IronManProto.IronManRequest01>() {
@Override
public void onNext(IronManProto.IronManRequest01 value) {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onCompleted() {
}
};
}
接下來在onNext()的部分寫上接收值
System.out.println("我收到Client端的Name訊息: " + value.getName());
System.out.println("我收到Client端的Age訊息: " + value.getAge());
首先在onNext這裡,我們一樣是接收來自client端的訊息,然後在onCompleted這邊,然後在onCompleted()中寫上接收到Client端後要回傳的結果
IronManProto.IronManResponse01.Builder builder = IronManProto.IronManResponse01.newBuilder();
builder.setResult("我是server端,我收到全部的訊息,回傳一個response給Client");
IronManProto.IronManResponse01 ironManResponse01 = builder.build();
//將response回傳給client端
responseObserver.onNext(ironManResponse01);
//發送一個傳輸完成的標籤給client
responseObserver.onCompleted();
我們要讓Server回傳response給client,所以我們在這邊設定好要回傳的response訊息,並且將訊息封裝,然後使用responseObserver的onNext()程式將訊息回傳給Client端,最後在傳遞一個onCompleted()的標籤給client端,說明server端的傳遞已經結束。
到這邊為止,我們已經完成server端撰寫,明天我們要來進行client端的實作。