如何判断流何时到达它';s结束

本文关键字:结束 何时 何判断 判断 | 更新日期: 2023-09-27 18:28:06

在不使用BinaryWriter/Reader的情况下,如何将TCP流的大小嵌入或告知接收器?

必须有一种快速的方法让它知道它是否已经到达了终点,当然,除了终止连接。

tcp.GetStream().Write(ms.GetBuffer(), 0, (int)ms.Length);

我这样发送,但接收是最困难的部分。

编辑:

这对我不起作用:

                while (tt1.GetStream().DataAvailable)
                {
                    su = Image.FromStream(tt1.GetStream());
                }

如何判断流何时到达它';s结束

不,没有一种方法(快速或慢速)可以判断何时到达网络流的末尾。DataAvailable会告诉您当前是否有可用的数据,但它不能告诉您是否会有更多的数据流。

据我所知,有两种可靠的方法可以确定你是否已经到达网络流的末尾:

  1. 让发送方将长度(int或long)作为流的前4(或8)个字节发送。接收器读取这个长度,然后继续读取流,直到读取那么多字节
  2. 就"流结束"标记达成一致。这可以采取多种形式。例如,对于只包含ASCII字符串的简单流,您可以同意字节值255表示字符串结束。或者可以使用ASCII EOT字符。对于面向记录的字符串,记录的第一个字节可以是记录类型,0xFF的记录类型可以表示"记录结束"

换句话说,网络流不知道它何时结束。不像文件流可以。您必须在数据中对流长度或流结束标记进行编码。

更新

System.Drawing.Image.FromStream的文档说明:

如果使用相同的流连续调用此方法,则流将重置为零。

因此,您不能使用该方法从同一流中读取多个图像。

我怀疑你需要做的是更改你的数据,使其结构如下:

length | data for image 1 | length | data for image 2 | 0

然后,您将读取长度,将这么多字节读取到字节数组中,并从该字节数组创建图像(可能通过将内存流包裹在它周围),然后读取下一个长度、下一个字节块等,直到读取长度为0,这表示流的结束。

您可以在接收器中使用.DataAvailable属性来确定流中是否还有可用的数据要读取,但Length属性本身没有实现。

使用

do {
    ...
    myNetworkStream.Read(buffer, 0, someSizeToCopyEachLoop)
}
while(myNetworkStream.DataAvailable);

如果您确实需要流的长度,您可以将其内容复制到MemoryStream并读取其.Length属性:

MemoryStream s = new MemoryStream();
myNetworkStream.CopyTo(s);
int length = s.Length;