我尝试在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);
}
}
答案 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);
}