C#Socket單向請求檔案傳輸[擴充斷點續傳]

來源:互聯網
上載者:User
由於是單向請求,就是說主動的只有用戶端。當用戶端上傳檔案的時候,需要先傳給服務端一個資料,告訴服務端它將要上傳檔案以及檔案的大小,用戶端要求的分包大小,將要發送的分包個數,原路徑,目標路徑等等,服務端根據這個資訊尋找臨時檔案,看是否接受過此檔案,如果接受過,服務端發送一條資料給用戶端告訴用戶端,已經接受到的檔案大小,分包個數,分包大小,然後用戶端調整分包大小,發送一條資料到服務端,告訴服務端它協議解析正確開始發送資料,服務端發送確認訊息,用戶端開始傳送檔案資料,服務端開始接受檔案資料並將其寫入檔案,發送完成之後,用戶端發資料告訴服務端發送完成,服務端核對檔案資訊,發送確認資訊給用戶端,關閉socket連結。當用戶端下載檔案的時候,需要先傳給服務端一個資料,告訴服務端它將要下載檔案,用戶端要求的分包大小,原路徑,目標路徑,已經接受的分包個數,分包大小等等,服務端根據這個資訊尋找檔案,發送一條資料給用戶端告訴用戶端檔案大小,分包個數,分包大小,然後用戶端發送一條資料到服務端,告訴服務端它協議解析正確開始接受資料,服務端發送確認訊息,服務端開始傳送檔案資料,用戶端開始接受檔案資料並將其寫入檔案,發送完成之後,服務端發資料告訴用戶端發送完成,用戶端核對檔案資訊,發送確認資訊給服務端,關閉socket連結。 由於篇幅,只貼幾個方法的代碼private void sendMsg(string srcPath, string dirPath, bool isUpdate, string fName, long fLength, long dLength, long dNumber)
        {
            string msg = srcPath + "*" + dirPath + "*" + isUpdate + "*" + fName + "*" + fLength + "*" + dLength + "*" + dNumber;
            try
            {
                socket.Send(Encoding.UTF8.GetBytes(msg));
            }
            catch(Exception ex)
            {
                throw new Exception("Send message error:\n " + ex);
            }
        } private void reciveFile(string srcPath, string dirPath,string fName,long dLength,long dReciveNumber,long dNumber)
        {       
            FileStream fs = null;
            try
            {
                try
                {
                    fs = new FileStream(dirPath, FileMode.OpenOrCreate);
                   
                    string dir = "sendRes:OK:OK";
                    sendDir(dir);
                }
                catch (Exception ex)
                {
                    string dire = "sendRes:error:" + ex.ToString();
                    sendDir(dire);
                    throw ex;
                }
                byte[] buffer = new byte[dLength];
                while (true)
                {
                    //Thread.Sleep(1);
                    int n = socket.Receive(buffer);
                    dReciveNumber++;
                    fs.Write(buffer, 0, n);
                    fs.Flush();
                    if (dReciveNumber==dNumber)
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }
            }
               
        } 就到這兒吧
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.