从 NetworkStream 读取数据

Reading data from NetworkStream

我尝试在 NetworkStream 上发送大量数据(图像),但看起来单个 Read 是不够的 - 我想尝试读取在一个网络上发送的所有数据NetworkStream,但我不知道该怎么做。另外,我想将此数据作为字节数组 byte[]。知道怎么做吗?

byte[] b = new byte[length];
int bytes = 0;
while (!GetNetworkStream().DataAvailable)
    Thread.Sleep(20); // Some delay
bytes = GetNetworkStream().Read(b, 0, b.Length);
MemoryStream ms = new MemoryStream();
ms.Write(b, 0, bytes);

我也尝试了下一个似乎不起作用的代码:

using (NetworkStream stream = CommunicationHandler.GetStream())
{
    byte[] data = new byte[1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int numBytesRead;
        while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
        ms.Write(data, 0, numBytesRead);
    }
}

正如我所看到的,您在这里放置了一些您自己创建的方法,我想您在读取数据方面没有任何问题。 你真正需要的是在新文件开始时的某种句柄,因为你的套接字应该连续接收数据。

这显然取决于你想使用哪种图像格式,你想发送什么。 对于 PNG 文件,您应该阅读此 pdf 文件的第 12 章。特别是第 12 节。如果你按这样的顺序,你可以从缓冲区中查找签名和提取数据

(decimal)             137 80 78 71 13 10 26   10
(hexadecimal)          89 50 4e 47 0d 0a 1a   0a
(ASCII C notation)   1 P  N   G \r \n 2 \n

然后您只需重新创建 png 文件即可。您必须对发送的每种类型的文件执行相同的操作。

如果您不关心文件的内容,您可以创建一些数据框并将数据放入有效负载(压缩和加密)。创建自己的签名 blahblahblah。 最简单的例子是 Modbus。您可以阅读更多相关信息 here

编辑

读取tcp流的数据很简单。看看这段代码。

var receiveBufferSize = 512; // amount of bytes to read
try
{
    var buffer = new byte[receiveBufferSize];
    _tcpClient.GetStream().Read(buffer, 0, receiveBufferSize);
    // handle the received data chunk
}
catch (Exception e)
{
    // handle the error
    Debug.WriteLine(ex.Message);
}