Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 11:03   #1
Running
 
Регистрация: 01.03.2013
Сообщений: 3
По умолчанию C# стрим и кеширование видео

Хорошего настроения каждому зашедшему.
Не могу справиться с проблемой.
Дано: приложение на с#, удаленный сервер с видео, приложение стримит видео с удаленного сервера.

Нужно сделать: сохранение стрима на компьютер, чтобы каждое просмотренное видео можно было отыграть в оффлайне.

Идея: сорц видеокомпонента посылает запрос не на сервер, а на "локальную прокси" (класс listener), этот класс заменяет Host в хедере с 127.0.0.1:1489 на айпишник удаленного сервера, начинает стримить с сервера в видеокомпонент, попутно записывая получаемую информацию (видео) на диск.

Что есть: собственно, готов сам стрим без использования прокси, класс прокси (подключение к нему проходит успешно).

Что не получается сделать: наадить стрим в приложение через класс listener.

Не знаю, как послать запрос на получение данных из прокси на сервер.

Класс listener (прокси):

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;


using System.IO;
using System.Threading;
using System.Text.RegularExpressions;

namespace Teacher
{
    public class Listener
    {

        public TcpListener _listener;

        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                string resp = encoder.GetString(message, 0, bytesRead);
                System.Diagnostics.Debug.WriteLine(resp);

                //вот где-то тут нужно формировать и посылать хедер, но я не знаю, как
                int indx = resp.IndexOf("Host");
                string pattern = @"\b(\w+)\s\1\b";
                                
                Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
                
                var address = Dns.GetHostAddresses("hanker.ru")[0];

                string newresp = rgx.Replace(resp, "Host: 127.0.0.1:1488", "Host: " + address + ":1488");




            }

            tcpClient.Close();
        }

        public Listener()
        {
            new Thread(Start) { IsBackground = true }.Start();

        }

        private void Start()
        {
            _listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1488);
            //catch the MediaPlayer requests here 
            _listener.Start();
            while (true)
            {
                //blocks until a client has connected to the server
                TcpClient client = _listener.AcceptTcpClient();
                // here was first an message that send hello client
                //
                ///////////////////////////////////////////////////
                //create a thread to handle communication
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }


        //do streaming and caching here

        private int StreamAndSave(Stream outputNetStream, Stream responceStream, Stream fileStream, long fileSize)
        {
            int bytesRead = 0;
            byte[] buffer = new byte[4096];
            while (fileSize > 0)
            {
                int readBytes = responceStream.Read(buffer, 0, buffer.Length);
                if (readBytes > 0)
                {
                    try
                    {
                        //write bytes to response and send it to MediaPlayer
                        outputNetStream.Write(buffer, 0, readBytes);
                        //save to the file system
                        fileStream.Write(buffer, 0, readBytes);
                        bytesRead += readBytes;
                    }
                    catch (Exception e)
                    {
                        break;
                    }
                }
                else break;
                fileSize -= readBytes;
            }
            return bytesRead;
        }
    }
}
Помогите разобраться!
Running вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кеширование скрипта. Predator199 PHP 4 29.06.2012 14:22
Версионное кеширование Kostia PHP 0 22.10.2011 11:12
кеширование изображений kirosin PHP 4 19.07.2010 01:51
Разговор по телефону с оператором СТРИМ Syltan Свободное общение 1 19.11.2009 18:20
Кеширование картинок Gatti Помощь студентам 0 10.10.2009 15:12