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