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());
        }
Example #2
0
        /// <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));
 }