C# 在C语言中读取重复的流数据源#
假设我有一个指向流数据源(例如更新的天气数据流)的url,我知道这个url与GET一起工作(我验证了它确实返回了流数据)。流是用GZIP压缩的,每个“消息”都以一个1字节的id开始,一个包含消息长度的2字节部分,然后是另一个包含一些专有信息的2字节部分。之后是消息本身,然后只要流保持打开状态,这种格式就会重复 每次收到完整的消息时,我都需要执行一段代码,将原始字节解析为.net类型(如果我有一个字节数组可以使用,我可以确定解析部分)。我已经尝试了无数的方法,我在网上找到了类似的情况,但由于某种原因,无法让这个工作。如果有人也能解释如何使用POST而不是GET来完成同样的过程,我们也会非常感激。提前谢谢大家 另外,从我自己的尝试来看,似乎只有异步读取才能工作。这就是我在尝试时摔倒的地方C# 在C语言中读取重复的流数据源#,c#,httpwebrequest,streaming,get,webrequest,C#,Httpwebrequest,Streaming,Get,Webrequest,假设我有一个指向流数据源(例如更新的天气数据流)的url,我知道这个url与GET一起工作(我验证了它确实返回了流数据)。流是用GZIP压缩的,每个“消息”都以一个1字节的id开始,一个包含消息长度的2字节部分,然后是另一个包含一些专有信息的2字节部分。之后是消息本身,然后只要流保持打开状态,这种格式就会重复 每次收到完整的消息时,我都需要执行一段代码,将原始字节解析为.net类型(如果我有一个字节数组可以使用,我可以确定解析部分)。我已经尝试了无数的方法,我在网上找到了类似的情况,但由于某种原
鲍勃到底是什么不起作用?您是否尝试过使用
GetResponseStream()
获取响应流,对字节[]
缓冲区执行stream.Read()
,然后使用位转换器
?类似于:
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);
}
}
public IEnumerator GetEnumerator()
{
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(uri);
req.AutomaticDecompression=DecompressionMethods.GZip;
流s=req.GetResponse().GetResponseStream();
BinaryReader read=新的BinaryReader;
while(true)
{
字节id=read.ReadByte();
short len=(short)((read.ReadByte())
我找到了一些更好的搜索词,并在这个问题的答案中找到了我丢失的信息。我使用的是IAsyncResult,请求状态对象不正确
流抛出一个异常,基本上说它必须异步读取。它是一个ConnectStream。实际上这看起来很好,但我认为我没有编写过自己的GetEnumerator方法,所以我不确定如何在我的其他代码中使用它。如果OP说的是真的,这将需要像BeginRead一样的异步I/O。这就是我使用它的方式,请让我知道这是否是错误的。while(this.GetEnumerator(getUrl).MoveNext()){byte[]bytes=this.GetEnumerator(getUrl).Current;}当我以这种方式使用它时,它似乎永远在这一行等待:byte[]msgBytes=read.ReadBytes(len)@biker,想法是这将在一个类中,该类具有uri
实例字段并实现IEnumerable
。然后可以使用循环来迭代该类的实例。如果没有意义,可以将其更改为返回IEnumerable
的常规方法,并迭代返回的值。okay,谢谢你的努力。你的实现帮助我意识到哪里出了问题,然后我找到了正确的解决方案(异步解决方案)。