我有一個客戶端服務器的情況,客戶端將數據(例如電影)發送到服務器,服務器將該數據保存到HDD。通過TCP發送數據
它通過固定的字節數組發送數據。發送字節後,服務器詢問是否有更多,如果是的話,發送更多等等。每件事情都進展順利,所有的數據都得到了解決。
但是當我嘗試播放電影時,它無法播放,如果我查看每個電影(客戶端和服務器)的文件長度,則服務器電影比客戶端電影更大,當我查看命令時屏幕在發送/接收數據的末尾有多於100%的字節。
我能想到的唯一可能是錯誤的事實是,我的服務器讀取流,直到固定的緩衝區數組已滿,因此在最後有更多的字節,然後客戶端。但是,如果這是問題,我該如何解決這個問題?
我剛剛加了2個方法發送,因爲tcp連接的工作原理,歡迎任何幫助。
客戶
public void SendData(NetworkStream nws, StreamReader sr, StreamWriter sw)
{
using (FileStream reader = new FileStream(this.path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024];
int currentBlockSize = 0;
while ((currentBlockSize = reader.Read(buffer, 0, buffer.Length)) > 0)
{
sw.WriteLine(true.ToString());
sw.Flush();
string wait = sr.ReadLine();
nws.Write(buffer, 0, buffer.Length);
nws.Flush();
label1.Text = sr.ReadLine();
}
sw.WriteLine(false.ToString());
sw.Flush();
}
}
服務器
private void GetMovieData(NetworkStream nws, StreamReader sr, StreamWriter sw, Film filmInfo)
{
Console.WriteLine("Adding Movie: {0}", filmInfo.Titel);
double persentage = 0;
string thePath = this.Path + @"\films\" + filmInfo.Titel + @"\";
Directory.CreateDirectory(thePath);
thePath += filmInfo.Titel + filmInfo.Extentie;
try
{
byte[] buffer = new byte[1024]; //1Kb buffer
long fileLength = filmInfo.TotalBytes;
long totalBytes = 0;
using (FileStream writer = new FileStream(thePath, FileMode.CreateNew, FileAccess.Write))
{
int currentBlockSize = 0;
bool more;
sw.WriteLine("DATA");
sw.Flush();
more = Convert.ToBoolean(sr.ReadLine());
while (more)
{
sw.WriteLine("SEND");
sw.Flush();
currentBlockSize = nws.Read(buffer, 0, buffer.Length);
totalBytes += currentBlockSize;
writer.Write(buffer, 0, currentBlockSize);
persentage = (double)totalBytes * 100.0/fileLength;
Console.WriteLine(persentage.ToString());
sw.WriteLine("MORE");
sw.Flush();
string test = sr.ReadLine();
more = Convert.ToBoolean(test);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
,緩衝區中剩餘的字節不會是零,他們將以前的內容緩衝區。 – svick