//一个 双向流式 RPC 是双方使用读写流去发送一个消息序列。两个流独立操作,因此客户端和服务器 //可以以任意喜欢的顺序读写:比如, 服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替 的读取和写入消息, //或者其他读写的组合。每个流中的消息顺序被预留。你可以通过在请求和响应前加 stream 关键字去制定方法的类型 public override Task Register4(IAsyncStreamReader <RegisterRq> requestStream, IServerStreamWriter <PbMsgRet> responseStream, ServerCallContext context) { return(Task.Run(async() => { ReqCount++; while (await requestStream.MoveNext(context.CancellationToken)) { //客户端有两次流写入,因此有两次流读取,因此这里输入Data、Data2 Console.WriteLine(requestStream.Current.Name); } Console.WriteLine("开始返回结果"); var ret = new PbMsgRet() { ErrCode = GrpcTest.Services.Enumeration.ErrorCodes.Success, ErrMsg = "sdsd", }; //服务端两次流写入 await responseStream.WriteAsync(ret); ret.ErrMsg = "sdsd2"; await responseStream.WriteAsync(ret); })); }
////一个 简单 RPC , 客户端使用存根发送请求到服务器并等待响应返回,就像平常的函数调用一样 public override Task <PbMsgRet> Register1(RegisterRq request, ServerCallContext context) { ReqCount++; var ret = new PbMsgRet() { ErrCode = GrpcTest.Services.Enumeration.ErrorCodes.Success, ErrMsg = "sdsd", }; return(Task.FromResult(ret)); }
//一个 服务器端流式 RPC , 客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流, //直到里面没有任何消息。从例子中可以看出,通过在 响应 类型前插入 stream 关键字,可以指定一个服务器端的流方法 public override Task Register2(RegisterRq request, IServerStreamWriter <PbMsgRet> responseStream, ServerCallContext context) { return(Task.Run(async() => { ReqCount++; var ret = new PbMsgRet() { ErrCode = GrpcTest.Services.Enumeration.ErrorCodes.Success, ErrMsg = "sdsd", }; //服务端两次流写入 await responseStream.WriteAsync(ret); ret.ErrMsg = "sdsd2"; await responseStream.WriteAsync(ret); })); }