我有我的传输文件应用程序的问题..一切看起来不错,工作的方式应该是..但后来我发现一些发送的文件被损坏。
就像我发送视频文件(.MP4)时发送成功,但是当我播放它时,它的一些帧遭到损坏,就像在快照图片中一样。我播放了源Mp4文件,图片非常完美,从不像在那张照片里。
所以这里是我的代码..我现在对使用fs.Seek
感到困惑。有人告诉我,它不会使新文件与源文件相同。发送的文件有一些损坏的数据TCP套接字..如何解决它?
我使用套接字TCP ..(.NET 4.0)
发送方法(CLIENT):
FileStream fs;
long sum;
long fileSize;
byte[] data = null;
NetworkStream network;
const int packetSize = 1024*8;
private void SendFile(string srcPath, string destPath)
{
string dest = Path.Combine(destPath, Path.GetFileName(srcPath));
using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
{
try
{
sum = 0;
int count = 0;
data = new byte[packetSize];
//send the destination path and the file size to SERVER.
SendCommand("receive<" + dest + "<" + fs.Length.ToString());
while (sum < fileSize)
{
if (fileSize - sum < packetSize)
{
count = fs.Read(data, 0, Convert.ToInt32(fileSize - sum));
network.Write(data, 0, Convert.ToInt32(fileSize - sum));
}
else
{
count = fs.Read(data, 0, data.Length);
network.Write(data, 0, data.Length);
}
fs.Seek(sum, SeekOrigin.Begin);
sum += count;
backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize));
}
network.Flush();
}
finally
{
fs.Dispose();
data = null;
}
}
}
Receive方法(服务器):
FileStream fs;
long sum;
long fileSize;
byte[] data = null;
NetworkStream network;
const int packetSize = 1024*8;
public void Receive(string destPath, long fileSize)
{
using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
{
try
{
int count = 0;
long sum = 0;
data = new byte[packetSize];
while (sum < fileSize)
{
if (fileSize - sum < packetSize)
{
count = network.Read(data, 0, Convert.ToInt32(fileSize - sum));
fs.Write(data, 0, Convert.ToInt32(fileSize - sum));
}
else
{
count = network.Read(data, 0, data.Length);
fs.Write(data, 0, data.Length);
}
fs.Seek(sum, SeekOrigin.Begin);
sum += count;
}
}
finally
{
fs.Dispose();
data = null;
}
}
}
你为什么要寻找'fs'?它应该已经在下一次阅读的正确位置。 – 2012-03-04 21:37:44
它没有与SEEK工作..我试图删除该行 – 2012-03-04 23:29:09