| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Распределённые приложения и сеть > Миграция клиента |
| Автор: 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 | ||
Клиент можно написать. Но беда в том, что этот клиент должен потом ведь вызвать Windows Media Player. Как передать ему поток? И ещё вопрос: а сетевой exception мы должны кидать? Или при проблеме со связью будет какой-то стандартный? |
| Автор: mr.DUDA 24.12.2005, 09:25 | ||||
Самый простой способ - сохранить весь файл на диск и вызывать плеер через командную строку. Более сложный способ - интегрировать плеер в своё приложение, тогда возможно (не уверен) есть способ воспроизводить видео/аудио "на лету" по мере скачивания потока.
Все исключения генерируются системой, автоматически. К примеру, если юзаем TcpClient в паре с NetworkStream, то у нас будут возникать исключения SocketException (при неудачном соединении, например), ObjectDisposedException (если сокет был преждевременно закрыт, а мы пытаемся читать из потока), IOException (если поток был закрыт, а мы читаем из него), кроме того у NetworkStream есть св-во CanRead, показывающее, можно ли читать из потока. Всё это описано в MSDN, простр-во имён System.Net.Sockets. |
| Автор: dmitryperets 25.12.2005, 18:31 |
| Спасибо. А как лучше организовать стриминг? У нас пока обычный Web Streaming, но с ним будет проблема - тэги *.asx, пускающие поток не с начала, не будут работать... |