gpt4 book ai didi

c# - 如何判断 Stream 何时结束?

转载 作者:可可西里 更新时间:2023-11-01 02:44:56 32 4
gpt4 key购买 nike

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

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

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

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

编辑:

这对我不起作用:

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

最佳答案

不,没有办法(快或慢)告诉您何时到达网络流的末尾。 DataAvailable 会告诉您数据当前是否可用,但它无法告诉您是否有更多数据流下来。

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

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

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

更新

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

The stream is reset to zero if this method is called successively with the same stream.

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

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

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

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

关于c# - 如何判断 Stream 何时结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18275830/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com