【问题标题】:C# Read from a NetworkstreamC# 从网络流中读取
【发布时间】: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 字节。检查它的返回值并继续阅读直到你读到len bytes..

标签: c# networking stream


【解决方案1】:

在您的服务器代码中,您忽略了 NetworkStream.Read 的结果,这是读取的实际字节数。这可能少于您实际请求的字节数。您需要继续调用 Read,直到收到所需的所有字节。

您看到的 1 次或多次写入之间的差异与网络堆栈中的缓冲/定时有关。我怀疑您只是在进行单次写入时很幸运地收到了图像 - 情况并非总是如此!您需要按上述说明处理 Read 的结果。

代码示例:

void ReadBuffer(byte[] buffer, int offset, int count)
{
    int num;
    int num2 = 0;
    do
    {
        num2 += num = _stream.Read(buffer, offset + num2, count - num2);
    }
    while ((num > 0) && (num2 < count));
    if (num2 != count)
        throw new EndOfStreamException
            (String.Format("End of stream reached with {0} bytes left to read", count - num2));
    }

【讨论】:

  • 好吧..购买我可以问你为什么当我直接写入网络流时它只是即时读取整个内容? @凯文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多