Код: Выделить всё
private void CreateLListener()
{
HttpListenerContext context = null;
HttpListener listener = new HttpListener();
bool listen = true;
while(listen)
{
try
{
context = listener.GetContext();
}
catch (...)
{
listen = false;
}
// process request and make response
}
}
Для дальнейшего объяснения: клиент представляет собой приложение медиаплеера, которое начинается с запроса медиафайла со свойством заголовка запроса Range bytes=0-. Насколько я могу судить, он делает это, чтобы определить, что такое медиаконтейнер.
После того, как он прочитал «фрагмент» (или если он прочитал достаточно, чтобы определить тип мультимедиа), он затем делает еще один запрос (от другого номера клиентского сокета) с Range bytes=X-Y. В этом случае Y — это Content-Length, возвращенная в первом ответе, а X — на 250 000 байт меньше этого значения (обнаружено с помощью IIS в качестве теста). На этом этапе он получает последний «кусок», чтобы проверить, может ли он получить метку времени мультимедиа для измерения длины.
Прочитав это, он делает еще один запрос с Range bytes=0- (из другого номера сокета), чтобы правильно начать потоковую передачу медиафайла.
Однако в любой момент, если пользователь клиента выполняет операцию «пропуска», он затем отправляет другой запрос (из другого номера сокета). с Range bytes=Z-, где Z — позиция перехода в медиафайле.
Я не очень хорошо разбираюсь в HTTP-вещах, но, насколько я могу судить, мне нужно использовать несколько потоков для обработки каждого запроса/ответа, позволяя при этом исходному HttpListener вернуться к прослушиванию. Я много искал, но не смог найти подходящую модель.
РЕДАКТИРОВАНИЕ:
Признание и благодарность Рику Стралу за следующий пример, который мне удалось адаптировать в соответствии со своими потребностями...
Добавьте веб-сервер в свое приложение .NET 2.0 с помощью нескольких строк кода
Подробнее здесь: https://stackoverflow.com/questions/903 ... tplistener
Мобильная версия