public override async Task <Empty> SetPowerActuals(global::Grpc.Core.IAsyncStreamReader <Power> requestStream, global::Grpc.Core.ServerCallContext context) { while (await requestStream.MoveNext()) { var msg = requestStream.Current; cst.Power.Actual = msg.Enabled; } return(new Empty()); }
/// <summary> /// 上传文件 /// </summary> /// <param name="requestStream">请求流</param> /// <param name="responseStream">响应流</param> /// <param name="context">站点上下文</param> /// <returns></returns> public override async Task FileUpload(global::Grpc.Core.IAsyncStreamReader <FileReply> requestStream, global::Grpc.Core.IServerStreamWriter <FileReturn> responseStream, global::Grpc.Core.ServerCallContext context) { List <string> lstFilesName = new List <string>(); //文件名 List <FileReply> lstContents = new List <FileReply>(); //数据集合 FileStream fs = null; DateTime startTime = DateTime.Now;//开始时间 string mark = string.Empty; string savePath = string.Empty; try { //reply.Block数字的含义是服务器和客户端约定的 while (await requestStream.MoveNext())//读取数据 { var reply = requestStream.Current; mark = reply.Mark; if (reply.Block == -2)//传输完成 { Console.WriteLine($"{mark},完成上传文件。共计【{lstFilesName.Count}】个,耗时:{DateTime.Now - startTime}"); break; } else if (reply.Block == -1) //取消了传输 { Console.WriteLine($"文件【{reply.FileName}】取消传输!"); //写入日志 lstContents.Clear(); fs?.Close(); //释放文件流 if (!string.IsNullOrEmpty(savePath) && File.Exists(savePath)) //如果传输不成功,删除该文件 { File.Delete(savePath); } savePath = string.Empty; break; } else if (reply.Block == 0) //文件传输完成 { if (lstContents.Any()) //如果还有数据,就写入文件 { lstContents.OrderBy(c => c.Block).ToList().ForEach(c => c.Content.WriteTo(fs)); lstContents.Clear(); } lstFilesName.Add(savePath); //传输成功的文件 fs?.Close(); //释放文件流 savePath = string.Empty; //告知客户端,已经完成传输 await responseStream.WriteAsync(new FileReturn { FileName = reply.FileName, Mark = mark }); } else { if (string.IsNullOrEmpty(savePath)) //有新文件来了 { savePath = Path.GetFullPath(".//Files"); //文件路径 if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } savePath = Path.Combine(savePath, reply.FileName); fs = new FileStream(savePath, FileMode.Create, FileAccess.ReadWrite); Console.WriteLine($"{mark},上传文件:{savePath},{DateTime.UtcNow:HH:mm:ss:ffff}"); } lstContents.Add(reply); //加入链表 if (lstContents.Count() >= 20) //每个包1M,20M为一个集合,一起写入数据。 { lstContents.OrderBy(c => c.Block).ToList().ForEach(c => c.Content.WriteTo(fs)); lstContents.Clear(); } } } } catch (Exception ex) { Console.WriteLine($"{mark},发生异常({ex.GetType()}):{ex.Message}"); } finally { fs?.DisposeAsync(); } }
public override Task <Empty> SetLocActuals(global::Grpc.Core.IAsyncStreamReader <Loc> requestStream, global::Grpc.Core.ServerCallContext context) { return(base.SetLocActuals(requestStream, context)); }