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"的错误:
我发现在一段时间后 - 它写的都是零:

题
我究竟做错了什么 ?我如何修复代码,以便发送整个文件?
看起来您的客户端代码没有读完整个内容:在检查内容之前,您应该有一个循环读取到最后:
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)
目前,您的代码读取的数据与网络流选择最初可用的数据一样多,并且在不检索其余字节的情况下停止.