C# Socket實現斷點上傳文件

public partial class VAV_File_Client
    {
        private string path = "";
        private string strBaseDir = "";
        private string host = "";
        private int port1 = 0;
        private int port2 = 0;
        private int port3 = 0;
        private bool IsXuChuan = false;
        private bool IsFuGai = false;
        private int BackDay = 0;
        private int SIZEBUFFER = 0;

        public VAV_File_Client()
        {
            path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
            strBaseDir = System.Configuration.ConfigurationManager.AppSettings["strBaseDir"].ToString();
            host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
            port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
            port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
            port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
            IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
            IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
            BackDay = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["BackDay"].ToString());
            SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
        }
        /// <summary>
/// 啓動
/// </summary>
        public void start()
        {
            try
            {
                GetAllDirList(strBaseDir, BackDay);
                foreach (string pathDir in al)
                {
                    if (pathDir.Contains("\t<目錄>"))
                    {
                        string ddddS = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);
                        scoketSend(host, port2, Encoding.UTF8.GetBytes(ddddS));  //傳輸文件名稱
                        sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//傳輸文件
                        continue;
                    }
                    //string fileName = pathDir.Substring(pathDir.LastIndexOf("\\") + 1);
                    string fileName = pathDir.Substring(pathDir.IndexOf(strBaseDir) + strBaseDir.Length);

                    byte[] bs = Encoding.UTF8.GetBytes(fileName);

                    scoketSend(host, port2, bs);  //傳輸文件名稱

                    sendFlie(host, port1, pathDir, IsXuChuan, IsFuGai);//傳輸文件

                    DelFile(pathDir);
                }
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            Console.WriteLine("end");
        }


        //連接服務器發送數據
        /// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <param name="bs"></param>
        private void scoketSend(string host, int port, byte[] bs)
        {

            IPAddress ip = IPAddress.Parse(host);
            //   int port = 2006;
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            c.Connect(ipe);
            c.Send(bs, bs.Length, 0);
            c.Close();
        }
        //連接服務器接收數據
        /// <summary>
///
/// </summary>
/// <param name="host"></param>
/// <param name="port">2006</param>
/// <returns></returns>
        private string scoketReceive(string host, int port)
        {
            IPAddress ip = IPAddress.Parse(host);
            //   int port = 2006;
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            c.Connect(ipe);
            string startStr = "";
            byte[] startBytes = new byte[SIZEBUFFER];
            int bytess;
            bytess = c.Receive(startBytes, startBytes.Length, 0);
            startStr += Encoding.ASCII.GetString(startBytes, 0, bytess);
            c.Close();
            return startStr;
        }
        //傳輸文件名稱
        /// <summary>
///
/// </summary>
/// <param name="path">127.0.0.1</param>
/// <param name="port">2006</param>
        private void sendName(string host, int port, string path)
        {
            //string host = "127.0.0.1";
            IPAddress ip = IPAddress.Parse(host);
            //int port = 2006;
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            c.Connect(ipe);

            string fileName = path.Substring(path.LastIndexOf("\\") + 1);
            //UTF8處理中文
            byte[] bs = Encoding.UTF8.GetBytes(fileName);
            c.Send(bs, bs.Length, 0);
            c.Close();
        }
        //所傳輸的文件是否續傳
        /// <summary>
/// 所傳輸的文件是否續傳
/// </summary>
/// <param name="str"></param>
/// <param name="host">127.0.0.1</param>
/// <param name="port">port = 2007</param>
/// <param name="xuchuan">是否續傳</param>
        public void setxc(string str, string host, int port, bool xuchuan)
        {
            IPAddress ip = IPAddress.Parse(host);

            port = 2007;
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            c.Connect(ipe);
            string Str = str;
            byte[] bxc = Encoding.ASCII.GetBytes(Str);
            c.Send(bxc, bxc.Length, 0);
            c.Close();
        }

        //傳輸文件/// <summary>
        /// <summary>
///
/// </summary>
/// <param name="host">"127.0.0.1"</param>
/// <param name="port">port = 2005;</param>
/// <param name="fileName">帶路徑的文件名</param>
/// <param name="xuchuan">是否需要續傳</param>
/// <param name="cover">是否覆蓋</param>
        private void sendFlie(string host, int port, string fileName, bool xuchuan, bool IsFuGai)
        {
            try
            {
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                c.Connect(ipe);//建立於遠程主機的鏈接
//接收服務器返回存在的文件大小
                byte[] startBytes = new byte[SIZEBUFFER];
                string startStr = Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
                //已接受文件長度
                int startSet = int.Parse(startStr);
                byte[] b = new byte[SIZEBUFFER];            //創建文件緩衝區,這裏可以認爲文件的最大值
                if (fileName.Contains("\t<目錄>"))
                {
                    c.Close();        //關閉Socket
                    return;
                }
                FileStream file = File.Open(fileName, FileMode.Open, FileAccess.Read);   //創建文件流
//文件字節總長度
                int fileAllLength = (int)file.Length;
                //文件剩餘字節長度
                int fileLast = startSet < fileAllLength ? fileAllLength - startSet : 0;

                int intLength = 0;
                #region  續傳
                if (startSet > 0 && startSet < fileAllLength && xuchuan == true)
                {
                    //傳輸文件是否續傳
                    setxc("xc", host, port3, xuchuan);
                    file.Seek(long.Parse(startStr), SeekOrigin.Begin); //移動文件流中的當前指針
                    intLength = int.Parse(startStr);
                    while (fileLast > 0)
                    {
                        int count = file.Read(b, 0, b.Length);
                        int readbytes = count >= b.Length ? b.Length : count;
                        readbytes = c.Send(b, 0, readbytes, SocketFlags.None);
                        Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
                        fileLast -= count;
                        intLength += count;
                        file.Seek(intLength, SeekOrigin.Begin);
                        if (fileLast == 0)
                        {
                            c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
                        }
                    }
                }
                #endregion
                #region
                else
                {
                    if (fileLast == 0 && IsFuGai == false)
                    {
                        setxc("qx", host, port3, xuchuan);
                    }
                    else
                    {
                        //傳輸文件是否續傳
                        setxc("bxc", host, port3, xuchuan);

                        while (fileLast > 0)
                        {
                            int count = file.Read(b, 0, b.Length);
                            int SdCount = fileLast < b.Length ? count : b.Length;
                            SdCount = c.Send(b, 0, SdCount, SocketFlags.None);
                            Encoding.ASCII.GetString(startBytes, 0, c.Receive(startBytes, startBytes.Length, 0));
                            fileLast -= count;//剩餘的字節長度
                            intLength += count;//定位指針用
                            file.Seek(intLength, SeekOrigin.Begin);
                            if (fileLast == 0)
                            {
                                c.Send(Encoding.UTF8.GetBytes("end"), Encoding.UTF8.GetBytes("end").Length, 0);
                            }
                            Console.WriteLine("已傳送字節:  " + intLength);
                        }
                    }
                }
                #endregion
                file.Close();     //關閉文件流
                string recvStr = "";
                byte[] recvBytes = new byte[SIZEBUFFER];
                int bytes;
                bytes = c.Receive(recvBytes, recvBytes.Length, 0);
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                //MessageBox.Show(recvStr);
                Console.WriteLine(recvStr);
                c.Close();        //關閉Socket
            }
            catch (NullReferenceException e)
            {
                Console.WriteLine("{0}", e);
            }
        }

        public ArrayList al = new ArrayList();//定義存儲文件和文件夾名的數組
        public int aaa = 0;//定義標誌位參數,遞歸時判斷該參數,若不爲0則非第一次遞歸
        /// <summary>
/// 獲取指定某一天之前的文件,不包括當天
/// </summary>
/// <param name="strBaseDir">指定目錄</param>
/// <param name="Day">指定天數</param>
        public void GetAllDirList(string strBaseDir, int Day)
        {
            DirectoryInfo di = new DirectoryInfo(strBaseDir);
            DirectoryInfo[] diA = di.GetDirectories();
            if (aaa == 0)
            {
                FileInfo[] fis2 = di.GetFiles();   //有關目錄下的文件  
                for (int i2 = 0; i2 < fis2.Length; i2++)
                {

                    if (fis2[i2].CreationTime < DateTime.Now.AddDays(Day) && fis2[i2].FullName.Substring(fis2[i2].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)//指定時間
                    {
                        al.Add(fis2[i2].FullName);
                    }
                }
            }
            for (int i = 0; i < diA.Length; i++)
            {
                aaa++;
                al.Add(diA[i].FullName + "\t<目錄>");
                //diA[i].FullName是某個子目錄的絕對地址,把它記錄在ArrayList中
                DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
                DirectoryInfo[] diA1 = di1.GetDirectories();
                FileInfo[] fis1 = di1.GetFiles();   //有關目錄下的文件  
                for (int ii = 0; ii < fis1.Length; ii++)
                {
                    if (fis1[ii].CreationTime < DateTime.Now.AddDays(Day) && fis1[ii].FullName.Substring(fis1[ii].FullName.LastIndexOf("\\") + 1).StartsWith("DEL_") == false)
                    {
                        al.Add(fis1[ii].FullName);
                    }
                }
                GetAllDirList(diA[i].FullName, Day);
            }
        }

        /// <summary>
/// 刪除文件
/// </summary>
/// <param name="FileName">文件名</param>
        public void DelFile(string FileName)
        {
            FileInfo fInfo = new FileInfo(FileName);

            fInfo.MoveTo(FileName.Replace(FileName.Substring(FileName.LastIndexOf("\\") + 1), "DEL_" + FileName.Substring(FileName.LastIndexOf("\\") + 1)));
        }

        private void DeleteInDir(string szDirPath)
        {
            if (szDirPath.Trim() == "" || !Directory.Exists(szDirPath))
                return;
            DirectoryInfo dirInfo = new DirectoryInfo(szDirPath);

            FileInfo[] fileInfos = dirInfo.GetFiles();
            if (fileInfos != null && fileInfos.Length > 0)
            {
                foreach (FileInfo fileInfo in fileInfos)
                {

                }
            }

            DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
            if (dirInfos != null && dirInfos.Length > 0)
            {
                foreach (DirectoryInfo childDirInfo in dirInfos)
                {
                    DeleteInDir(childDirInfo.ToString()); //遞歸
                }
            }
        }
    }

 

 

 

public partial class VAV_File_Server
    {
        private string PathFiles = "";
        private string host = "";
        private int port1 = 0;
        private int port2 = 0;
        private int port3 = 0;
        private bool IsXuChuan = false;
        private bool IsFuGai = false;
        private int SIZEBUFFER = 0;

        /// <summary>
/// 構造函數
/// </summary>
        public VAV_File_Server()
        {
            //path = System.Configuration.ConfigurationManager.AppSettings["APPEmailXML"].ToString();
            PathFiles = System.Configuration.ConfigurationManager.AppSettings["PathFiles"].ToString();
            host = System.Configuration.ConfigurationManager.AppSettings["ServerIP"].ToString();
            port1 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port1"].ToString());
            port2 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port2"].ToString());
            port3 = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["port3"].ToString());
            IsXuChuan = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsXuChuan"].ToString());
            IsFuGai = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["IsFuGai"].ToString());
            SIZEBUFFER = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SIZEBUFFER"].ToString());
        }
        Socket s;
        Socket s1;
        Socket s2;
        FileStream file;

        public void start()
        {

            #region
            try
            {
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe1 = new IPEndPoint(ip, port1);
                IPEndPoint ipe2 = new IPEndPoint(ip, port2);
                IPEndPoint ipe3 = new IPEndPoint(ip, port3);
                //創建Socket   實例  
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s1.Bind(ipe1);
                s.Bind(ipe2);
                s2.Bind(ipe3);
                s.Listen(0);
                s1.Listen(0);
                s2.Listen(0);
                while (true)
                {
                    get();
                }
                s.Dispose();
                s1.Dispose();
                s2.Dispose();

            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine("ArgumentNullException: {0}", e);

            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            // Console.ReadLine();
            #endregion
        }

        private void get()
        {
            try
            {
                while (true)
                {
                    //獲取Socket連接
                    Console.WriteLine("等待接收2006發來的數據");
                    Socket ss = s.Accept();

                    Console.WriteLine("收到2006的數據");
                    Console.WriteLine("等待接收2005發來的數據");
                    Socket ss1 = s1.Accept();
                    Console.WriteLine("收到2005的數據");

                    //接收的文件名稱
                    string recvStr = "";
                    if (ss.Connected)             //確定連接
                    {
                        byte[] recvBytes = new byte[SIZEBUFFER];
                        int bytes;
                        bytes = ss.Receive(recvBytes, recvBytes.Length, 0);
                        //UTF8處理中文
                        recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
                        ss.Close();
                    }
                    string path = "";

                    path = @PathFiles.EndsWith("\\") ? PathFiles + Regex.Replace(recvStr, @"^\\", "") : PathFiles + "\\" + Regex.Replace(recvStr, @"^\\", ""); //存放接收的文件路徑
                    if (path.Contains("\t<目錄>"))//D:\\Down\\第一層\t<目錄>
                    {
                        path = path.Replace("\t<目錄>", "");
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                        ss1.Send(Encoding.ASCII.GetBytes("0"), Encoding.ASCII.GetBytes("0").Length, 0);
                        continue;
                    }
                    long lStartPos = 0;
                    if (File.Exists(path))
                    {
                        file = File.OpenWrite(path);
                        lStartPos = file.Length;
                    }
                    else
                    {
                        file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //寫入文件流
//file = new FileStream(path, FileMode.Create); //寫入文件流
                        lStartPos = 0;
                    }

                    string startStr = lStartPos.ToString();
                    byte[] bstar = Encoding.ASCII.GetBytes(startStr);
                    ss1.Send(bstar, bstar.Length, 0);

                    if (ss1.Connected)             //確定連接
                    {
                        Console.WriteLine("2005連接成功");
                        //接收文件是否續傳
                        Console.WriteLine("2007接受文件是否續傳");
                        Socket ss2 = s2.Accept();
                        string str = "";
                        if (ss2.Connected)             //確定連接
                        {
                            byte[] xcBytes = new byte[SIZEBUFFER];
                            int bytes;
                            bytes = ss2.Receive(xcBytes, xcBytes.Length, 0);
                            str += Encoding.ASCII.GetString(xcBytes, 0, bytes);
                            ss2.Close();
                        }
                        if (str == "xc")
                        {
                            file.Seek(lStartPos, SeekOrigin.Current); //移動文件流中的當前指針
                        }
                        if (str == "bxc")
                        {
                            file.Close();
                            File.Delete(path);
                            file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //寫入文件流
                        }
                        if (str == "qx")
                        {
                            file.Close();
                            ss1.Shutdown(SocketShutdown.Both);
                            ss1.Close();

                        }
                        else
                        {

                            byte[] nbytes = new byte[SIZEBUFFER];
                            int nReadSize = 0;

                            nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);

                            ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的數據
                            int TotleSize = nReadSize;

                            while (nReadSize > 0)
                            {
                                file.Write(nbytes, 0, nReadSize);

                                nReadSize = ss1.Receive(nbytes, 0, nbytes.Length, SocketFlags.None);

                                if (Encoding.UTF8.GetString(nbytes, 0, nReadSize) == "end")
                                {
                                    break;
                                }
                                ss1.Send(Encoding.ASCII.GetBytes(nReadSize.ToString()), Encoding.ASCII.GetBytes(nReadSize.ToString()).Length, 0); //返回接收到的數據
                                Console.WriteLine("接收   " + nReadSize + " 字節");

                                TotleSize += nReadSize;
                                Console.WriteLine("接受總數爲" + TotleSize);
                            }

                            file.Close();

                            string sendStr = "Ok!Sucess!";
                            byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                            ss1.Send(bs, bs.Length, 0);
                            ss1.Shutdown(SocketShutdown.Both);

                            ss1.Close();

                        }

                    }
                }

            }
            catch (SocketException e)
            {
                Console.WriteLine("{0}", e);
            }
        }
    }

 

發佈了4 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章