Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Миграция клиента


Автор: dmitryperets 23.12.2005, 21:11
Добрый день,

Есть такой проект (для ВУЗа): виртуальный сервер для предоставления услуги потокового аудио. Т.е. имеется единый IP, к которому подключается клиент и выбирает песню. Далее центральный сервер ("мост") переводит клиента на один из нескольких серверов, которые непосредственно обеспечивают потоковое аудио клиенту. Выбор сервера осуществляется "мостом" в соответствии с нагрузкой или любым другим алгоритмом (например, Round Robin).

Теперь проблема... Необходимо обеспечить следующую функциональность. В случае, если в процессе получения клиентом потока с некого сервера, этот сервер вдруг падает, "мост" обязан тут же перевести клиента на другой сервер и продолжить поток оттуда. Клиент при этом ничего не должен почувствовать.

На сегодняшний день мы реализовали виртуальный сервер без поддержки этой "миграции". Всё очень просто: ASP.NET + C# + SQL + Windows Media Player. Но вот теперь нужно делать эту "миграцию". Может кто-то когда-то сталкивался с чем-то подобным? Помогите линком, идеей, чем угодно! Может стоит взять какой-то open source плеер и переделать его? Или ещё как? Любой самый маленький совет поможет!

Система не должна быть идеальной, но она должна работать.

Спасибо.

Автор: mr.DUDA 23.12.2005, 21:25
А что тут такого сложного? C#-клиент работает по следующему алгоритму:

1) соединяемся с центральным сервером и просим у него IP свободного download-сервера
2) соединяемся с download-сервером и начинаем скачивание данных с начала требуемого файла
3) при ошибке (когда клиент словил сетевой exception) снова соединяемся с центральным сервером и по новой просим IP свободного download-сервера, затем переходим к пункту 2, только качаем не с начала файла а с прерванной позиции

Это всё, конечно, если клиент - приложение написанное нами (например на C#), а не "голый" Windows Media Player.

Автор: dmitryperets 23.12.2005, 21:43
Цитата

3) при ошибке (когда клиент словил сетевой exception) снова соединяемся с центральным сервером и по новой просим IP свободного download-сервера, затем переходим к пункту 2, только качаем не с начала файла а с прерванной позиции

Это всё, конечно, если клиент - приложение написанное нами (например на C#), а не "голый" Windows Media Player.


Клиент можно написать. Но беда в том, что этот клиент должен потом ведь вызвать Windows Media Player. Как передать ему поток?

И ещё вопрос: а сетевой exception мы должны кидать? Или при проблеме со связью будет какой-то стандартный?

Автор: mr.DUDA 24.12.2005, 09:25
Цитата(dmitryperets @ 23.12.2005, 20:43)
Клиент можно написать. Но беда в том, что этот клиент должен потом ведь вызвать Windows Media Player. Как передать ему поток?

Самый простой способ - сохранить весь файл на диск и вызывать плеер через командную строку. Более сложный способ - интегрировать плеер в своё приложение, тогда возможно (не уверен) есть способ воспроизводить видео/аудио "на лету" по мере скачивания потока.

Цитата(dmitryperets @ 23.12.2005, 20:43)
И ещё вопрос: а сетевой exception мы должны кидать? Или при проблеме со связью будет какой-то стандартный?

Все исключения генерируются системой, автоматически. К примеру, если юзаем TcpClient в паре с NetworkStream, то у нас будут возникать исключения SocketException (при неудачном соединении, например), ObjectDisposedException (если сокет был преждевременно закрыт, а мы пытаемся читать из потока), IOException (если поток был закрыт, а мы читаем из него), кроме того у NetworkStream есть св-во CanRead, показывающее, можно ли читать из потока. Всё это описано в MSDN, простр-во имён System.Net.Sockets.

Автор: dmitryperets 25.12.2005, 18:31
Спасибо. А как лучше организовать стриминг? У нас пока обычный Web Streaming, но с ним будет проблема - тэги *.asx, пускающие поток не с начала, не будут работать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)