从NetworkStream读取数据

时间:2019-05-27 00:09:42

标签: c# sockets byte memorystream 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);
    }
}

1 个答案:

答案 0 :(得分:1)

正如我所见,您在这里放入了一些自己创建的方法,我想您在读取数据时没有任何问题。 您真正需要的是在新文件启动时进行某种处理,因为您的套接字应该连续接收数据。

显然,这取决于要使用的图像格式以及要发送的图像。 对于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)   \211 P  N   G \r \n \032 \n

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

如果您不关心文件的内容,则可以创建一些数据帧并将数据放入有效负载中(压缩和加密)。创建自己的签名等等。 最简单的示例是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);
}