我的传输文件应用程序有问题..一切看起来都很棒,并且应该按原样运行..但后来我发现发送文件的某些部分已损坏。
就像当我发送一个视频文件(.MP4)时,它发送成功,但是当我播放它时,它的一些帧像快照图片一样被破坏了......我播放了源Mp4文件,图片非常完美,从不看起来像那张快照图片
所以这是我的代码..我现在很困惑使用fs.Seek
..有人告诉我它不会使新文件与源文件相同。
我正在使用SOCKETS 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;
}
}
}
接收方法(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;
}
}
}
答案 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会读取它所能达到的全部内容限制您作为参数提供。