C# 如何修复文件传输,收到的文件已损坏?
我有使用tcp套接字的文件传输应用程序[服务器-客户端] 当我发送一个文件时,它会成功,但当我发送一个包含许多文件的文件夹时,收到的文件会损坏,请注意,从客户端发送的文件和从服务器接收的文件都具有相同的大小名称字节数 服务器:C# 如何修复文件传输,收到的文件已损坏?,c#,sockets,file-transfer,corrupt-data,C#,Sockets,File Transfer,Corrupt Data,我有使用tcp套接字的文件传输应用程序[服务器-客户端] 当我发送一个文件时,它会成功,但当我发送一个包含许多文件的文件夹时,收到的文件会损坏,请注意,从客户端发送的文件和从服务器接收的文件都具有相同的大小名称字节数 服务器: private void ReceiveX(Socket client, string destPath, long size, int bufferSize) { using (Stream stream = File.Create(destPa
private void ReceiveX(Socket client, string destPath, long size, int bufferSize)
{
using (Stream stream = File.Create(destPath))
{
byte[] buffer = new byte[bufferSize];
long sum = 0;
int count = 0;
do
{
count = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
stream.Write(buffer, 0, count);
sum += count;
} while (sum < size);
}
}
服务器,循环列表中以前从服务器接收的文件,其中包含客户端将要发送的文件信息名称、路径和大小:
private void ReceiveFolderTh(IPEndPoint endpoint, List<_File> Files, string destDir, int bufferSize)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(IPAddress.Parse("127.0.0.1"), endpoint.Port);
foreach (_File file in Files)
{
Directory.CreateDirectory(destDir + Path.GetDirectoryName(file.Name));
ReceiveX(client, destDir + file.Name, file.Size, bufferSize);
}
client.Dispose();
}
那么我该如何解决这个问题呢?很可能的问题是,您的客户端在第一个文件中接收到太多的数据,因为您的文件之间没有明确的分隔。您的接收代码是:
do
{
count = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
stream.Write(buffer, 0, count);
sum += count;
} while (sum < size);
这将阻止您从一个文件的末尾读取到下一个文件的开头。我已经用这种方法解决了这个问题,客户机:尝试{SendFile}最终{socket.Receivenew byte[1],SocketFlags.None;}服务器:尝试{ReceiveFile}最终{Client.Sendnew byte[1],SocketFlags.None;},所以客户端将等待服务器发送一个字节,但您的方式看起来更好!哪一个更快?我的方法应该稍微快一点。
private void ReceiveFolderTh(IPEndPoint endpoint, List<_File> Files, string destDir, int bufferSize)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(IPAddress.Parse("127.0.0.1"), endpoint.Port);
foreach (_File file in Files)
{
Directory.CreateDirectory(destDir + Path.GetDirectoryName(file.Name));
ReceiveX(client, destDir + file.Name, file.Size, bufferSize);
}
client.Dispose();
}
do
{
count = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
stream.Write(buffer, 0, count);
sum += count;
} while (sum < size);
int bytesToReceive = Math.Min(buffer.Length, size - sum);
count = client.Receive(buffer, 0, bytesToReceive, SocketFlags.None);