在同一台计算机上,我有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);
}
我的客户代码:
(让我们拿一个我知道它的大小的简单文件)
我的发送代码:
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
写道:
问题出在哪里?
2.jpg
已损坏!当我尝试打开图像时,我看到了:
(而不是与1.jpg
相同的图像)
所以我去看了“HEX”的错误:
我发现一段时间后 - 它写的都是零:
问题
我做错了什么?我如何修复代码以便发送整个文件?
答案 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);