繁体   English   中英

从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)   \211 P  N   G \r \n \032 \n

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

如果您不关心文件的内容,则可以创建一些数据帧并将数据放入有效负载中(压缩和加密)。 创建自己的签名等等。 最简单的示例是Modbus。 您可以在此处了解更多信息。

编辑

读取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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM