NetworkStream截断我的数据?

时间:2014-12-24 00:37:25

标签: c# file task .net-4.5 networkstream

在同一台计算机上,我有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);
   }

写入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);
    }

我的客户代码

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

enter image description here

我的发送代码:

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

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

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

结果:

2.jpg写道:

enter image description here

问题出在哪里?

2.jpg已损坏!当我尝试打开图像时,我看到了:

enter image description here

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

所以我去看了“HEX”的错误:

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

larger iamge

enter image description here

问题

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

2 个答案:

答案 0 :(得分:7)

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

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

目前,您的代码会读取网络流选择最初可用的数据,并在不检索剩余字节的情况下停止。

答案 1 :(得分:3)

一次读取所有字节并不是一个好主意。您应该按块读取数据,如下所示:

buffer = new byte[4096];
int offset = 0;
do {
  int read = networkStream.Read(buffer, offset, buffer.Length - offset);
  offset += read;
} while (read != 0);