Чтение повторяющегося источника потоковых данных в C # - PullRequest
0 голосов
/ 23 июня 2010

Допустим, у меня есть URL-адрес источника потоковых данных (например, потока обновленных данных о погоде), и я знаю, что этот URL-адрес работает с GET (я проверил, что он возвращает данные о потоке).Поток сжимается с помощью GZIP, каждое «сообщение» начинается с 1-байтового идентификатора, 2-байтовой части, содержащей длину сообщения, затем другой 2-байтовой части с некоторой частной информацией.После этого приходит само сообщение, а затем этот формат повторяется до тех пор, пока поток остается открытым.

Мне нужно выполнять блок кода каждый раз, когда получено полное сообщение, которое будет анализировать необработанные байты в типы .net (я могу понять часть анализа, я уверен, если у меня есть массив байтовработать с).Я пробовал бесконечные способы, которые я нашел в сети для подобных ситуаций, но по какой-то причине не могу заставить это работать.Если бы кто-то мог также объяснить, как сделать тот же процесс, используя POST вместо GET, это также было бы оценено.Спасибо всем заранее!

PS Из моих собственных попыток на это похоже, что будет работать только асинхронное чтение.Вот где, я думаю, я упал в своих попытках.

Боб

Ответы [ 3 ]

1 голос
/ 23 июня 2010

Что-то вроде:

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);
    }
}
1 голос
/ 23 июня 2010

Я нашел несколько лучших поисковых терминов и нашел этот вопрос, где в ответе содержалась информация, которую мне не хватало. Я неправильно работал с IAsyncResult и объектом состояния запроса.

C #: загрузка URL с таймаутом

0 голосов
/ 23 июня 2010

Что не работает, точно?Вы пытались получить поток ответов с помощью GetResponseStream(), сделать Stream.Read() в byte[] буфер и затем использовать BitConverter?

...