Example #1
0
        private static void recvMsg()
        {
            string msg = null;

            byte[] msgBuf    = new byte[128]; //128 字节
            int    byteCount = 0;

            while (sock != null)
            {
                //接收服务端数据
                MyLogger.WriteLine("GetCsvSock listen next csv msg.....");
                try {
                    byteCount = sock.Receive(msgBuf);
                }
                catch
                {
                    MyLogger.WriteLine("close socket exception!");
                    return;
                }
                if (byteCount == -1)
                {
                    MyLogger.WriteLine("GetCsvSock exit!");
                    break;
                }

                msg = Encoding.UTF8.GetString(msgBuf);

                //错误响应reqcsv:
                if (msg.StartsWith("errreqcsv:"))
                {
                    MyLogger.WriteLine("<下载csv>:服务端回应请求错误! " + msg);
                    MessageBox.Show(msg.Split('#')[1], "csv文件缺失");

                    //设置CombxSummaryFile 没有summary 文件
                    parent.setSumFileComb(-1);

                    //清空datagridview 中的内容
                    parent.clearGridView();

                    //csv响应错误,也要请求文件dict
                    if (!File.Exists(Environment.CurrentDirectory + "\\" + userId + "_" + trialDate + ".dict"))
                    {
                        queryDdgFiles(userId, trialDate);
                    }

                    continue;
                }

                //正常响应reqcsv:  msg = "resreqcsv:#" + csvFiles.Count + "#" + sumId + "#";
                else if (msg.StartsWith("resreqcsv:"))
                {
                    MyLogger.WriteLine("<下载csv>服务端回应!" + msg);
                    //获取服务端summary数量
                    string[] splits     = msg.Split('#');
                    int      sumFileNum = Int32.Parse(splits[1]);

                    //更新FmMain 中的summary.csv下拉框
                    parent.setSumFileComb(sumFileNum);

                    //开始接收 csv 数据包
                    //> 第一种方法
                    #region 接收csv 数据
                    bool ifDataEnd = false;

                    int    count      = 0;
                    int    maxFileLen = 1024 * 512;//512 k
                    byte[] fileBuf    = new byte[maxFileLen];

                    string csvFileName = userId + "_" + trialDate + "_" + splits[2] + ".csv";
                    MyLogger.WriteLine("recv Data run:" + csvFileName);

                    //保存的csv 文件路径
                    //保存在当前软件运行的目录下
                    //该summary.csv 文件命名形式为 userId_date.csv
                    //最后退出软件时,会删除所有临时文件

                    string name = Environment.CurrentDirectory + "\\" + csvFileName;
                    using (FileStream fs = new FileStream(name, FileMode.Create))
                    {
                        while (!ifDataEnd)
                        {
                            try
                            {
                                count = sock.Receive(fileBuf);
                            }
                            catch
                            {
                                MyLogger.WriteLine("close recv sock exception!");
                            }

                            //正常数据
                            if (count > 128) // 64
                            {
                                try
                                {
                                    fs.Write(fileBuf, 0, count);
                                    fs.Flush();//------add
                                }
                                catch { MyLogger.WriteLine("接收csv文件时,写入文件错误!"); }
                            }
                            else //count < 64
                            {
                                msg = Encoding.UTF8.GetString(fileBuf);

                                //文件结束标志  end:# file_name # file_left #
                                if (msg.StartsWith("endcsv:"))
                                {
                                    msg = "resendcsv:#" + name + "#"; // end:# unique #
                                    try
                                    {
                                        sock.Send(Encoding.UTF8.GetBytes(msg.ToCharArray()));//response
                                        MyLogger.WriteLine("客户端回应:" + msg);
                                    }
                                    catch { MyLogger.WriteLine("发送csv接收完成的回应时,socket错误!"); }

                                    //结束
                                    ifDataEnd = true;

                                    //防止接收到结束符,文件流还没关闭的情况
                                    if (fs.CanWrite)
                                    {
                                        fs.Close();
                                        MyLogger.WriteLine(139 + "csv文件下载成功,保存在:\n" + name);
                                    }
                                }
                                //不能整段发送的剩余数据
                                else
                                {
                                    MyLogger.WriteLine("段数据 写入csv 文件!");
                                    try {
                                        fs.Write(fileBuf, 0, count);
                                        fs.Close();
                                        MyLogger.WriteLine("csv 文件关闭");
                                    }
                                    catch { MyLogger.WriteLine("csv段数据接收并关闭文件时错误!"); }
                                }
                            }
                        } // while (!ifDataEnd)
                    }     // using(FileStream fs
                    #endregion

                    //> 使用线程去读取csv文件 并装填到DataGridView 中
                    Thread th = new Thread(csv3);
                    th.IsBackground = true;
                    th.Start(name);
                }

                // 错误响应 reqdbgfile:
                else if (msg.StartsWith("errreqdbgfile"))
                {
                    MyLogger.WriteLine("<下载dbgfiles>:服务端回应请求错误! " + msg);
                    MessageBox.Show(msg.Split('#')[1], "搜索错误!");
                    continue;
                }

                //正常响应 reqdbgfile:
                else if (msg.StartsWith("resreqdbgfile:"))
                {
                    string trialUnique = msg.Split('#')[1];
                    MyLogger.WriteLine("接收服务端resreqdbgfile:\n" + msg);

                    //接收dbgfiles 信息
                    byte[] dbgFileBuf = new byte[1024 * 300]; //300k
                    try
                    {
                        sock.Receive(dbgFileBuf);
                    }
                    catch
                    {
                        MyLogger.WriteLine("接收resreqdbgfiles响应 出错!");
                    }
                    msg = Encoding.UTF8.GetString(dbgFileBuf);
                    string[] dbgFileArr = msg.Split('#')[0].Split(','); // msg.Split('#')[0] => 文件列表
                    try
                    {
                        FileStream fs = new FileStream(Environment.CurrentDirectory + "\\" + trialUnique + ".dict",
                                                       FileMode.Create);
                        StreamWriter sw = new StreamWriter(fs);
                        foreach (string s in dbgFileArr)
                        {
                            sw.WriteLine(s);
                        }
                        sw.Close();
                        fs.Close();
                        MyLogger.WriteLine(Environment.CurrentDirectory + "\\" + trialUnique + ".dict 保存完成!");

                        //显示界面中点击按钮
                        parent.enablePic();
                    }
                    catch (Exception ex)
                    {
                        MyLogger.WriteLine("保存dbgfiles dict 文件时错误!" + ex.Message);
                    }
                }

                //错误响应 reqbunchfile
                else if (msg.StartsWith("errreqbunchfile:"))
                {
                    MyLogger.WriteLine("<下载bunchfiles>:服务端回应请求错误! " + msg);
                    MessageBox.Show(msg.Split('#')[1], "下载错误!");
                    continue;
                }

                //正常响应 reqbunchfile
                else if (msg.StartsWith("resreqbunchfile:"))
                {
                    //直接开始接收bunch files 文件信息
                    int    maxFileLen      = 1024 * 512;//512 k
                    byte[] fileBuf         = new byte[maxFileLen];
                    string fileName        = null;
                    int    waitRecvFileNum = Int32.Parse(msg.Split('#')[1]); //要下载的文件个数
                    long   allFileLength   = long.Parse(msg.Split('#')[2]);
                    long   sent            = 0;

                    FmBchDnldProgrs prog = null;
                    if (bchDnldProg) //如果要显示bunch files 下载进度条
                    {
                        prog = new FmBchDnldProgrs(waitRecvFileNum, allFileLength);
                        prog.Show(parent);
                    }

                    //监听每个文件上传请求
                    DateTime now = DateTime.Now;
                    string   tm  = now.ToLongTimeString();
                    tm = tm.Substring(0, tm.Length - 3).Replace(':', '.'); //09:34:23 > 09.34.23

                    //另外的这种时间格式是用来进行数据分析的时候
                    //方便文件操作
                    if (!bchDnldProg)
                    {
                        tm = userId + "_" + trialDate; //1000248501_trial日期
                    }

                    List <string> dnldFiles  = new List <string>();
                    int           taskFileId = 1;
                    while (waitRecvFileNum >= 1)
                    {
                        //监听文件头 信息
                        int count = 0;
                        try
                        {
                            sock.Receive(msgBuf);
                            msg = Encoding.UTF8.GetString(msgBuf);
                        }
                        catch
                        {
                            MyLogger.WriteLine("文件批量下载时,监听单个文件信息错误!");
                            break;
                        }

                        //file: # file_len # file_name #
                        if (msg.StartsWith("singleinfo:"))
                        {
                            fileName = msg.Split('#')[2];
                            MyLogger.WriteLine("singleinfo:\n" + msg);

                            bool   ifFileEnd = false;
                            string fmTmp     = dnldDir + "\\" + tm + "-" + fileName;
                            using (FileStream fs = new FileStream(fmTmp, FileMode.Create))
                            {
                                //监听文件数据 loop
                                while (!ifFileEnd)
                                {
                                    try
                                    {
                                        count = sock.Receive(fileBuf);
                                    }
                                    catch {
                                        MyLogger.WriteLine("bunch file 下载时,接收文件信息时socket 错误!");
                                        break;
                                    }
                                    //正常数据
                                    if (count > 128)
                                    {
                                        try
                                        {
                                            fs.Write(fileBuf, 0, count);
                                            sent += count;
                                        }
                                        catch (Exception ex)
                                        {
                                            MyLogger.WriteLine("exceptioin:\n" + ex.Message);
                                            MyLogger.WriteLine("bunch file 下载时,写入文件信息时错误!");
                                        }
                                    }
                                    else
                                    {
                                        msg = Encoding.UTF8.GetString(fileBuf);

                                        //文件结束标志  singleend:# file_name # file_left #
                                        if (msg.StartsWith("singleend:"))
                                        {
                                            try
                                            {
                                                waitRecvFileNum = Int32.Parse(msg.Split('#')[2]);
                                                MyLogger.WriteLine("还剩余文件:" + (waitRecvFileNum - 1) + " 待传输\n");
                                            }
                                            catch { MyLogger.WriteLine("parse 文件待传输数量时异常!"); }

                                            //结束
                                            ifFileEnd = true;

                                            //[add]
                                            if (fs.CanWrite)
                                            {
                                                try
                                                {
                                                    fs.Close();
                                                    MyLogger.WriteLine("保存文件:" + fileName + " 成功!\n");
                                                }
                                                catch { MyLogger.WriteLine("bunfile 关闭接收文件时异常!"); }
                                            }
                                        }

                                        //不能整段发送的剩余数据
                                        else
                                        {
                                            try
                                            {
                                                fs.Write(fileBuf, 0, count);
                                                sent += count;
                                                fs.Close();
                                                MyLogger.WriteLine("保存文件:" + fileName + " 成功!\n");
                                            }
                                            catch { MyLogger.WriteLine("bunfile 关闭接收文件时异常!"); }
                                        }
                                    }
                                    if (prog != null)
                                    {
                                        prog.updtProg(waitRecvFileNum, fileName, sent);
                                    }
                                }// while(!iffileEnd)

                                //if (prog != null)
                                //{
                                //   prog.updtProg(waitRecvFileNum,fileName);
                                //}
                            }// using file()
                            dnldFiles.Add(fmTmp);
                            taskFileId++;
                        } // if (msg.StartsWith("singleinfo:"))
                    }     // while(waitRecvNum > 1)

                    if (prog != null) // 不是后台下载
                    {
                        //bunch files 传输完成!
                        MessageBox.Show("下载完成!", "message");
                    }
                    else //prog等于null,表示文件是为analyze后台下载的
                    {
                        //下载完待分析的文件后,callback通知分析
                        callback.dnldOkCallBack(dnldFiles);
                    }
                }
            }
        }