如何判断流何时结束?

Zer*_*ker 2 c# tcp stream

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

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

tcp.GetStream().Write(ms.GetBuffer(), 0, (int)ms.Length);
Run Code Online (Sandbox Code Playgroud)

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

编辑:

这对我不起作用:

                while (tt1.GetStream().DataAvailable)
                {
                    su = Image.FromStream(tt1.GetStream());
                }
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 5

不,没有办法(快或慢)告诉您何时到达网络流的末尾。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
Run Code Online (Sandbox Code Playgroud)

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