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();
}
}
} 就到這兒吧