发送文件有一些损坏的数据TCP套接字..如何解决?

时间:2012-03-04 21:20:29

标签: c# file-transfer corrupt

我的传输文件应用程序有问题..一切看起来都很棒,并且应该按原样运行..但后来我发现发送文件的某些部分已损坏。
就像当我发送一个视频文件(.MP4)时,它发送成功,但是当我播放它时,它的一些帧像快照图片一样被破坏了......我播放了源Mp4文件,图片非常完美,从不看起来像那张快照图片 所以这是我的代码..我现在很困惑使用fs.Seek ..有人告诉我它不会使新文件与源文件相同。

我正在使用SOCKETS 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;
            }
        }
    }

接收方法(SERVER):

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;
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

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

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

修改

以下是Receive

中代码的示例
count = network.Read(data, 0, data.Length);
fs.Write(data, 0, data.Length);

您如何确定已阅读data.Length字节

答案 1 :(得分:1)

如果您现在没有解决,我建议使用此代码。把它放在里面(sum&lt; 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;

这将确保您只传输已阅读的数据。请注意,您不需要 if 部分,因为Read将返回读取的字节数,因此无论您是在文件的开头还是结尾都是无关紧要的,Read会读取它所能达到的全部内容限制您作为参数提供。