【问题标题】:Reading a repeating streaming data source in C#在 C# 中读取重复的流数据源
【发布时间】:2010-06-23 03:05:40
【问题描述】:

假设我有一个指向流数据源的 url(例如更新的天气数据流),并且我知道这个 url 可以与 GET 一起使用(我验证它确实返回了流数据)。流使用 GZIP 压缩,每个“消息”以 1 字节 id 开头,2 字节部分包含消息长度,然后是另一个 2 字节部分,包含一些专有信息。之后是消息本身,然后只要流保持打开状态,就会重复这种格式。

每次收到完整的消息时,我都需要执行一段代码,它将原始字节解析为 .net 类型(我可以弄清楚解析部分,我确定我是否有一个字节数组可以使用)。我已经尝试了无数种方法,我在网上找到了类似情况,但由于某种原因无法让它发挥作用。如果有人也可以解释如何使用 POST 而不是 GET 来执行相同的过程,那也将不胜感激。提前谢谢大家!

附:从我自己的尝试看来,只有异步读取才能工作。这是我认为我在尝试中失败的地方。

鲍勃

【问题讨论】:

    标签: c# httpwebrequest streaming get webrequest


    【解决方案1】:

    类似:

    public IEnumerator<Message> GetEnumerator()
    {
        HttpWebRequest req = (HttpWebRequest) WebRequest.Create(uri);
        req.AutomaticDecompression = DecompressionMethods.GZip;
        Stream s = req.GetResponse().GetResponseStream();
        BinaryReader read = new BinaryReader(s);
        while(true)
        {
          byte id = read.ReadByte();
          short len = (short)((read.ReadByte() << 8) | read.ReadByte());
          short proprietary = (short)((read.ReadByte() << 8) | read.ReadByte());
          byte[] msgBytes = read.ReadBytes(len);
          yield return new Message(msgBytes);
        }
    }
    

    【讨论】:

    • 其实看起来还不错,但我想我从来没有写过自己的 GetEnumerator 方法,所以我不确定如何在我的其他代码中使用它。
    • 如果 OP 说的是真的,这将需要像 BeginRead 这样的异步 I/O。
    • 这就是我使用它的方式,如果这是错误的,请告诉我。 while(this.GetEnumerator(getUrl).MoveNext()) { byte[] bytes = this.GetEnumerator(getUrl).Current;当我以这种方式使用它时,它似乎在这一行永远等待: byte[] msgBytes = read.ReadBytes(len);
    • @Beaker,这个想法是在一个具有uri 实例字段并实现IEnumerable&lt;Message&gt; 的类中。然后,您可以使用 foreach 循环来迭代该类的实例。如果这没有意义,您可以将其更改为返回IEnumerable 的常规方法,并遍历返回的值。
    • 好的,感谢您的努力。您的实现帮助我意识到哪里出了问题,然后我能够找到正确的解决方案(异步解决方案)。
    【解决方案2】:

    我找到了一些更好的搜索词,并找到了这个问题,其中答案包含我所缺少的信息。我错误地使用了 IAsyncResult 和请求状态对象。

    C#: Downloading a URL with timeout

    【讨论】:

      【解决方案3】:

      究竟是什么不工作?您是否尝试过使用GetResponseStream() 获取响应流,对byte[] 缓冲区执行Stream.Read(),然后使用BitConverter

      【讨论】:

      • 流抛出异常,基本上说它必须异步读取。它是一个 ConnectStream。
      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多