2012-03-04 14 views
0

我有我的传输文件应用程序的问题..一切看起来不错,工作的方式应该是..但后来我发现一些发送的文件被损坏。
就像我发送视频文件(.MP4)时发送成功,但是当我播放它时,它的一些帧遭到损坏,就像在快照图片中一样。我播放了源Mp4文件,图片非常完美,从不像在那张照片里。
所以这里是我的代码..我现在对使用fs.Seek感到困惑。有人告诉我,它不会使新文件与源文件相同。发送的文件有一些损坏的数据TCP套接字..如何解决它?

我使用套接字TCP ..(.NET 4.0)

enter image description here

发送方法(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; 
      } 
     } 
    } 
+0

你为什么要寻找'fs'?它应该已经在下一次阅读的正确位置。 – 2012-03-04 21:37:44

+0

它没有与SEEK工作..我试图删除该行 – 2012-03-04 23:29:09

回答

1

如果你不解决这个问题现在,我提出这个代码。把它放在里面(总和< fileSize)。

发送:

count = fs.Read(data, 0, packetSize); 
    network.Write(data, 0, count); 
    sum += count; 
    backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize)); 

和接收:

count = network.Read(data, 0, packetSize); 
    fs.Write(data, 0, count); 
    sum += count; 

这将确保你只转移您已经阅读数据。请注意,如果部分不需要,因为Read将返回读取的字节数,因此,如果您处于文件的开头或结尾处,则无关紧要,Read将读取所有内容以限制您提供的参数。

+0

感谢的人..这是工作伟大的 – 2012-03-05 01:58:59

3

您从不考虑您从文件或网络流中读取的字节数。在您的服务器&客户端代码中查看您的count变量。

从输入流中读取后,您应该将count字节写入其他流。

编辑

这里是你的代码,你怎么能确定样品中Receive

count = network.Read(data, 0, data.Length); 
fs.Write(data, 0, data.Length); 

表明您已经阅读data.Length字节

+0

嗯,为什么我应该这样做? – 2012-03-04 21:34:12

+2

因为'stream.Read(buffer,0,1000)'并不意味着你将从流中获得1000个字节。它可以是0和1000之间的任何值。这就是为什么'Read'返回它读取多少字节的原因。 – 2012-03-04 21:36:01

+0

嗯..你会编辑我的代码并发布一个答案,因为我不知道我该怎么编辑 – 2012-03-05 01:22:59

相关问题