NetworkStream截断我的数据?

Roy*_*mir 3 c# file networkstream task .net-4.5

在同一台计算机上我有2个控制台应用程序.(客户端将文件发送到服务器)

在开始之前,我只想提一下我正在使用这两个async功能:

阅读NetworkStream:

 public static Task<int> ReadAsync1(this NetworkStream networkStream, byte[] buffer, int offset, int size)
   {
     return Task<int>.Factory.FromAsync(networkStream.BeginRead, networkStream.EndRead, buffer, offset, buffer.Length, networkStream);
   }
Run Code Online (Sandbox Code Playgroud)

写信给NetworkStream:

   public static Task WriteAsync1(this NetworkStream networkStream, byte[] buffer, int offset, int size)
    {
      return Task.Factory.FromAsync(networkStream.BeginWrite, networkStream.EndWrite, buffer, offset, buffer.Length, networkStream);
    }
Run Code Online (Sandbox Code Playgroud)

我的客户代码:

(让我们拿一个我知道它的大小的简单文件)

在此输入图像描述

我的发送代码:

 NetworkStream ns = socketForServer.GetStream();
 ns.WriteAsync1(File.ReadAllBytes(@"c:\r\1.jpg"), 0, 1593899);
 ns.Flush();
Run Code Online (Sandbox Code Playgroud)

我的服务器代码 :(阅读...)

byte[] d = new byte[1593899];
networkStream.Read(d, 0, d.Length);
File.WriteAllBytes(@"c:\r\2.jpg",d);
Run Code Online (Sandbox Code Playgroud)

结果:

2.jpg 写道:

在此输入图像描述

那问题出在哪里?

2.jpg已经腐败了!当我尝试打开图像时,我看到了这个:

在此输入图像描述

(而不是相同的图像1.jpg)

所以我去看了"HEX"的错误:

我发现在一段时间后 - 它写的都是零:

更大的iamge

在此输入图像描述

我究竟做错了什么 ?我如何修复代码,以便发送整个文件?

das*_*ght 7

看起来您的客户端代码没有读完整个内容:在检查内容之前,您应该有一个循环读取到最后:

int remaining = d.Length;
int pos = 0;
while (remaining != 0) {
    int add = networkStream.Read(d, pos, remaining);
    pos += add;
    remaining -= add;
}
Run Code Online (Sandbox Code Playgroud)

目前,您的代码读取的数据与网络流选择最初可用的数据一样多,并且在不检索其余字节的情况下停止.