我正在制作一个以块为单位通过TCP传输文件的程序。每次传输文件时,似乎末尾有一小部分未被写入,因此如果我尝试传输图片在右下角有故障。我的第一个想法是,在读取、传输和写入最后一个小于缓冲区长度的块时,我也写入了很多零。所以我试图相应地改变最后一个缓冲区大小。然后我使用一个只有HELLO WORLD的小文本文件进行了测试,但当我将其写入并打开文件时,它是空的。
以下是读取和发送代码,其中range[0]是第一部分,range[1]是最后一部分:
我错过了什么?我甚至在客户端和服务器上打印出缓冲区,它们是相等的。
任何帮助都将不胜感激,谢谢。
以下是读取和发送代码,其中range[0]是第一部分,range[1]是最后一部分:
byte[] buffer = new byte[DATA_BUFF_SIZE];
using (Stream input = File.OpenRead(file.Path))
{
Console.WriteLine("SENT PARTS # ");
for (int i = range[0]; i <= range[1]; i++)
{
Console.Write("PART " + i + ", ");
if (i == range[1])
{
buffer = new byte[input.Length - input.Position];
}
input.Position = i * DATA_BUFF_SIZE;
input.Read(buffer, 0, buffer.Length);
netStream.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("LENGTH = " + input.Length);
}
这是接收和写入代码:
int bytesReceived = 0;
int index = partRange.First;
int partNum = 0;
byte[] receiveBuffer = new byte[BUFF_SIZE];
if (index == partRange.Last)
{
receiveBuffer = new byte[fileToDownload.Length - index * BUFF_SIZE];
}
while ((bytesReceived = netStream.Read(receiveBuffer, 0, receiveBuffer.Length)) > 0)
{
Console.Write("INDEX:" + index + ", ");
output.Position = index * BUFF_SIZE;
output.Write(receiveBuffer, 0, receiveBuffer.Length);
index++;
partNum++;
if (partNum > (partRange.Last - partRange.First))
{
break;
}
if (index == partRange.Last)
{
receiveBuffer = new byte[fileToDownload.Length - index * BUFF_SIZE];
}
}
Console.WriteLine();
我错过了什么?我甚至在客户端和服务器上打印出缓冲区,它们是相等的。
任何帮助都将不胜感激,谢谢。