package greet; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; // The greeting service definition. service Greeter { // 客户端流式调用 rpc ClientStreamMethodAsync(stream ClientStreamMethodParam) returns (ClientStreamMethodResponse); }
message ClientStreamMethodParam { int32 par = 1; } message ClientStreamMethodResponse{ int32 result = 1; }
3. 服务端接口实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
///<summary> /// 客户端流实现,实现效果:客户端发送多个int类型的数字,服务端接收到后做累加,然后将最终结果返回客户端 ///</summary> ///<param name="requestStream"></param> ///<param name="context"></param> ///<returns></returns> publicoverrideasync Task<ClientStreamMethodResponse> ClientStreamMethodAsync(IAsyncStreamReader<ClientStreamMethodParam> requestStream, ServerCallContext context) { int result = 0; while (await requestStream.MoveNext()) { result += requestStream.Current.Par; Console.WriteLine($"Current Result { result }"); } returnawait Task.FromResult(new ClientStreamMethodResponse() { Result = result }); }
4. 客户端调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var channel = GrpcChannel.ForAddress("http://localhost:5004"); var client = new Greeter.GreeterClient(channel); var clientStreamMethodAsync = client.ClientStreamMethodAsync(); var requestStream = clientStreamMethodAsync.RequestStream; for (int k = 1; k < 11; k++) { await requestStream.WriteAsync(new ClientStreamMethodParam { Par = k }); Console.WriteLine($"send par {k}"); await Task.Delay(500); } //通知服务端 客户端流发送完毕 await requestStream.CompleteAsync(); var resultClientStream = await clientStreamMethodAsync; Console.WriteLine($"server response result: {resultClientStream.Result}");