将流写入文件无法正常工作

Fox*_*man 5 c# memorystream stream

我正在制作一个程序,通过 TCP 以块的形式传输文件。现在,每次我在最后传输文件时似乎都没有写入,因此如果我尝试传输右下角的图片,则会出现故障。现在,我的第一个想法是,当我读取、传输和写入小于缓冲区长度的最终块时,我也写入了很多零。所以我尝试相应地更改最后一个缓冲区大小。然后我使用一个只写有 HELLO WORLD 的小文本文件进行了尝试,但是当我输入它,然后打开文件时,它是空的。

这是读取和发送代码,其中 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);
}
Run Code Online (Sandbox Code Playgroud)

这是接收和编写代码:

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();
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我什至打印出客户端和服务器上的缓冲区,它是相等的。

任何帮助将不胜感激,谢谢。

Sco*_*ain 0

output.Write(receiveBuffer, 0, receiveBuffer.Length);
Run Code Online (Sandbox Code Playgroud)

需要是

output.Write(receiveBuffer, 0, bytesReceived);
Run Code Online (Sandbox Code Playgroud)

并非每次调用 netStream.Read 都会填充 receiveBuffer。

可能还有其他错误,但这是让我震惊的一个大错误。

编辑:看起来发送方有相同的错误,但你甚至没有保存 input.Read( 的结果)

  • @Foxman,如果您尝试将 1000 的缓冲区写入长度仅为 900 的数组,您将得到 OutOfRangeException。顺便说一句,您的帖子中绝对没有提到多线程 (2认同)