Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Бесконечный стриминг / 5 сообщений из 5, страница 1 из 1
02.06.2011, 20:46
    #37292345
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бесконечный стриминг
Здравствуйте

Разбираюсь со стримингом, вроде как открыть стрим и переслать клиенту проблем нет, но никак не получается сделать следующее:
хочу открыть стрим и передать его клиенту, а самому постоянно в него докладывать данные.

Что то типа потокового вещания... Это вообще возможно?



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    [ServiceContract(SessionMode = SessionMode.Allowed)]
    public interface ServiceContract
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        Stream GetSteram();
    }

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class ServiceImplementation : ServiceContract
    {
        private readonly object fTheLocker;
        private readonly Stream fStream;
        private readonly Timer fTimer;

        public ServiceImplementation()
        {
            fTheLocker = new object();

            fStream = new MemoryStream();

            fTimer = new Timer(1000);
            fTimer.Elapsed += (s, e) =>
                                  {
                                      byte[] _buffer = Encoding.ASCII.GetBytes(DateTime.Now.ToString("HH:mm:ss"));
                                      fStream.Write(_buffer, 0, _buffer.Length);
                                  };
            fTimer.Start();
        }

        #region ServiceContract Members

        public string GetData(int value)
        {
            return value.ToString();
        }

        public Stream GetSteram()
        {
                // этот не работает
            return fStream; 

                // этот вариант работает (при закомментаренном таймере
                //new MemoryStream(Encoding.ASCII.GetBytes(DateTime.Now.ToString("HH:mm:ss")));
        }

        #endregion
    }
...
Рейтинг: 0 / 0
03.06.2011, 10:30
    #37292921
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бесконечный стриминг
а что не получается то?
...
Рейтинг: 0 / 0
05.06.2011, 18:03
    #37295604
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бесконечный стриминг
AlexeiK,

Вот ошибка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
System.ObjectDisposedException was unhandled by user code
  Message="Cannot access a closed Stream."
  Source="mscorlib"
  ObjectName=""
  StackTrace:
       at System.IO.__Error.StreamIsClosed()
       at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
       at StockLibraryStreaming.ServiceImplementation.fTimer_Elapsed(Object sender, ElapsedEventArgs e) in D:\Мои документы\Visual Studio 2008\Projects\TEST\WCF\StockLibraryStreaming\ServiceImplementation.cs:line 35
       at System.Timers.Timer.MyTimerCallback(Object state)
  InnerException: 

Хотел бы на всякий случай акцентировать внимание - проблема не в том, что стрим не передается (он отлично передается), а в том, что я хочу постоянно в него что нибудь на стороне сервера дописывать, а у клиентов эти дописывания читать

Серверный код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
using System;
using System.IO;
using System.ServiceModel;
using System.Text;
using System.Timers;

namespace StockLibraryStreaming
{
    [ServiceContract(SessionMode = SessionMode.Allowed)]
    public interface ServiceContract
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        Stream GetSteram();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class ServiceImplementation : ServiceContract
    {
        private readonly Stream fStream;
        private readonly Timer fTimer;

        public ServiceImplementation()
        {
            var _buffer = Encoding.ASCII.GetBytes(@"Hello, World!");

            fStream = new MemoryStream();
            fStream.Write(_buffer, 0, _buffer.Length);
            fStream.Position = 0;

            fTimer = new Timer(10);
            fTimer.Elapsed += fTimer_Elapsed;
            fTimer.Start();
        }

        void fTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            var _buffer = Encoding.ASCII.GetBytes(DateTime.Now.ToString());

            fStream.Write(_buffer, 0, _buffer.Length); // <-- ошибка в этой строке
        }

        #region ServiceContract Members

        public string GetData(int value)
        {
            return value.ToString();
        }

        public Stream GetSteram()
        {
            return fStream; 
        }

        #endregion
    }
}



Клиентское консольное приложение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
using System;
using System.IO;
using System.Text;
using System.Threading;
using ConsoleClient.Srv;

namespace ConsoleClient
{
    class Program
    {
        private static ServiceContractClient fProxy;
        private static Thread fThread1;
        private static Thread fThread2;

        static void Main(string[] args)
        {
            fProxy = new ServiceContractClient();

            fThread1 = new Thread(FGetInt) {IsBackground = true};
            fThread2 = new Thread(FGetString) {IsBackground = true};

            fThread1.Start(fProxy);
            fThread2.Start(fProxy);

            Console.ReadLine();
        }

        private static void FGetInt(object obj)
        {
            var _proxy = (ServiceContractClient) obj;
            var _rnd = new Random();

            while (true)
            {
                Console.WriteLine(_proxy.GetData(_rnd.Next(0, 101)));
                Thread.Sleep(1000);
            }
        }

        private static void FGetString(object obj)
        {
            var _proxy = (ServiceContractClient)obj;
            Stream _stream = _proxy.GetSteram();

            while (true)
            {
                var _buffer = new byte[50];
                int _readed = _stream.Read(_buffer, 0, _buffer.Length);

                Console.WriteLine(Encoding.ASCII.GetString(_buffer, 0, _readed));
                Thread.Sleep(1000);
            }
        }
    }
}


Серверный конфиг
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NewBinding0" transferMode="Streamed" />
            </netTcpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="NewBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="NewBehavior" name="StockLibraryStreaming.ServiceImplementation">
                <clear />
                <endpoint address="" binding="netTcpBinding" bindingConfiguration="NewBinding0"
                    name="StreamTCP" contract="StockLibraryStreaming.ServiceContract"
                    listenUriMode="Explicit" />
                <endpoint address="" binding="mexHttpBinding" bindingConfiguration=""
                    name="StreamMEX" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:8888" />
                        <add baseAddress=" http://localhost:8889"  />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>


Клиентский конфиг
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="StreamTCP" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                    transferMode="Streamed" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:8888/" binding="netTcpBinding"
                bindingConfiguration="StreamTCP" contract="Srv.ServiceContract"
                name="StreamTCP">
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>
...
Рейтинг: 0 / 0
06.06.2011, 10:43
    #37296374
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бесконечный стриминг
Я вот подумал - а я бы не делал стриминг. Читал бы массив/список порциями (в отдельном потоке), да и все. По любому информация идет пакетами, да еще виндовс эти пакеты группирует - не посылает одиночные. Ну будет перерыв в вызове функции - и сразу же новый запрос - если связь есть, то вполне будет быстро, и никаких заморочек со стримингом.

Ну как бы надо быть абсолютно уверенным что без этого стриминга просто никак....
Кто знает - это типа в 100 раз быстрее? Что дает-то?
...
Рейтинг: 0 / 0
06.06.2011, 11:17
    #37296447
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бесконечный стриминг
D129Я вот подумал - а я бы не делал стриминг. Читал бы массив/список порциями (в отдельном потоке), да и все. По любому информация идет пакетами, да еще виндовс эти пакеты группирует - не посылает одиночные. Ну будет перерыв в вызове функции - и сразу же новый запрос - если связь есть, то вполне будет быстро, и никаких заморочек со стримингом.

Ну как бы надо быть абсолютно уверенным что без этого стриминга просто никак....
Кто знает - это типа в 100 раз быстрее? Что дает-то?

Ну это исследовательский проект - изучаю возможности применения.

Зачем нужно - если читать порциями byte[] или применять Callbacks - то каждая такая порция будет обертываться большим по размеру xml - ведь у нас же SOAP. То есть значительная часть трафика - служебная инфраструктура обеспечения передачи данных

А у нас в проектах требование высокой скорости передачи данных и минимальный размер трафика. Дело в том, что есть клиенты, которые до сих пор на модеме сидят, а данных хотят много и без задержек.

Было бы классно использовать отработанную технологию WCF с его инфраструктурой, но часть данных гнать напрямую как поток байтов. Тем более что стриминг почти так и работает. А что порции буфферизируются - так нестрашно, буфер не большой
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Бесконечный стриминг / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]