【发布时间】:2015-08-27 13:30:04
【问题描述】:
我试图通过网络流发送一个对象(在我的例子中是一个图像)..但是-我没有得到完整的图像..
这是客户端代码:
private void Form1_Load(object sender, EventArgs e)
{
TcpClient c = new TcpClient();
c.Connect("10.0.0.4", 10);
NetworkStream ns = c.GetStream();
Bitmap f = GetDesktopImage();
byte[] buffer = imageToByteArray(f);
byte[] len = BitConverter.GetBytes(buffer.Length);
MemoryStream stream = new MemoryStream();
stream.Write(len, 0, len.Length);
stream.Write(buffer, 0, buffer.Length);
stream.Position = 0;
stream.CopyTo(ns);
}
如您所见,我首先将整个内容 写入常规 MemoryStream(因为我不想使用两次 NetworkStream- 只有这样,我才将 MemoryStream 内容复制到 @ 987654324@.
服务器代码:
private void Form1_Load(object sender, EventArgs e)
{
TcpListener tl = new TcpListener(IPAddress.Any, 10);
tl.Start();
TcpClient c = tl.AcceptTcpClient();
network = new NetworkStream(c.Client);
byte[] buff = new byte[4];
network.Read(buff, 0, 4);
int len = BitConverter.ToInt32(buff, 0);
buff = new byte[len];
network.Read(buff, 0, buff.Length);
pictureBox1.Image = byteArrayToImage(buff);
Thread th = new Thread(method);
}
现在,当我运行这两个应用程序时,我只获得了捕获图像的顶部......这更奇怪,因为直接将两者都写入网络流非常完美......例如:
ns.Write(len, 0, len.Length);
ns.Write(buffer, 0, buffer.Length);
这会很好,我会在另一边得到完整的图像..但我不想使用它两次(这只是一个例子,在我的真实项目中我必须经常使用它所以我想要尽可能减少网络使用量,而不是为每个数据触发它)。
为什么仅使用 CopyTo 方法不起作用?
如果有任何帮助,我将不胜感激!
谢谢
【问题讨论】:
-
network.Read(buff, 0, buff.Length);不必读取buff.Length字节。检查它的返回值并继续阅读直到你读到lenbytes..
标签: c# networking stream