powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Бесконечный стриминг
5 сообщений из 5, страница 1 из 1
Бесконечный стриминг
    #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
Бесконечный стриминг
    #37292921
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что не получается то?
...
Рейтинг: 0 / 0
Бесконечный стриминг
    #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
Бесконечный стриминг
    #37296374
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот подумал - а я бы не делал стриминг. Читал бы массив/список порциями (в отдельном потоке), да и все. По любому информация идет пакетами, да еще виндовс эти пакеты группирует - не посылает одиночные. Ну будет перерыв в вызове функции - и сразу же новый запрос - если связь есть, то вполне будет быстро, и никаких заморочек со стримингом.

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

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

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

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

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

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


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