Exemple #1
0
        // можно создать разреженный объект поток и распихать его в дыры
        public MemoryStream ЗаписатьВВиртуальныйПоток(АМОбъект примитив)  //
        {
            var виртПоток = new MemoryStream();
            var писатель  = new BinaryWriter(виртПоток);
            var кодТипа   = Хранилище.кодыТипов[примитив.GetType()];

            писатель.Write(кодТипа);
            примитив.СохранисьВ(Писатель);

            return(виртПоток);
        }
Exemple #2
0
        public void ДобавитьИСохранить(АМОбъект примитивИлиАдрес)    // в конец
        {
            Память.Add(примитивИлиАдрес);

            Писатель.Seek(0, SeekOrigin.End);

            var кодТипа = кодыТипов[примитивИлиАдрес.GetType()];

            Писатель.Write(кодТипа);
            примитивИлиАдрес.СохранисьВ(Писатель);

            длинаФайла = (int)Писатель.BaseStream.Position;  // = + длинаАдреса + длина списка
        }
        public void ЗапуститьСервер()
        {
            // регистрация в службе TCPIP
            Слушатель = new TcpListener(IPAddress.Parse(АдресТСП.IPАдрес), АдресТСП.порт);

            //var задача = Слушатель.AcceptTcpClientAsync();
            //object состояние = null;
            //var результатВызова = Слушатель.BeginAcceptTcpClient(обратныйВызов, состояние);


            Слушатель.Start();

            Активен = true;

            while (Активен) //цикл обработки подключений
            {
                // ожидание подключения
                состояние = "ожидание подключения";
                сокет     = Слушатель.Server;
                //сокет.Listen(1);

                //ЦиклОбработкиСоединений();
                состояние = "новое входящее соединение установлено"; // событие

                клиент = Слушатель.AcceptTcpClient();                //  получение первого

                состояние = "новое входящее соединение установлено"; // событие
                //Начало сеанса

                var адресПодключившегося = (IPEndPoint)клиент.Client.RemoteEndPoint;
                var IP = адресПодключившегося.Address;    // здесь можно отфильтровать входящие соединения

                NetworkStream поток = клиент.GetStream(); //не очень удобный вариант совмещение входящего и исходящего буфера

                var читатель = new BinaryReader(поток);

                // получить команду
                // протокол обмена сообщениями
                состояние = "получение сообщениий";
                var протокол = АМОбъект.Создать(поток);  // получается Метка протокола общения, например "http" или описанный ниже, протокол это набор методов по обработке получаемых байт (распознования их)
                // список поддерживаемых команд, сценарии обмена сообщениями (в том числе команды)

                var команда = (Команда)АМОбъект.Создать(поток);  //здесь придти может любой примитив

                состояние = "получение закончено, обработка команды";
                АМОбъект результат = new СтрокаЮникода()
                {
                    Значение = "ошибка"
                };
                if (команда.Имя.Значение == "ТипОбъекта")
                {
                    результат = new СтрокаЮникода(ОбслуживаемыйПРимитив.GetType().Name);
                }

                if (команда.Имя.Значение == "ДайОбъект") // это уже внутренние команды Сервера
                {
                    результат = ОбслуживаемыйПРимитив.ВыполнитьКоманду(команда);
                }
                if (команда.Имя.Значение == "НаОбъект")
                {
                    // если тип пришедшего примитива совпадает с типом местного, то (а так вместо Целого здесь появиться что угодно )
                    // по идее здесь нужно создать новый Примитив и воостановить тот что передан в Параметрах
                    // АдресОбсуживаемогоПРимитваВКуче содержит эту команду "НаЗначение" если там ЦелоеВфайле
                    ОбслуживаемыйПРимитив = команда.Параметры[0];
                    ОбслуживаемыйПРимитив.ВыполнитьКоманду(команда);// = команда.Параметры[0]; //здесь надо отдавать команду , переадресовывать команду
                    // так можно запустить любую команду, хотя там где потоки они не запустяться, запустяться только 2 дай/на и запустить сервер
                    // можно сделать список команд из делегатов, лучше сделать команды примитивы, которые будут сохраняться и востанавливаться
                }


                //выполнить команду - это сообщение появляется если это уже не примитив
                if (команда.Имя.Значение == "ВыполнитьКоманду")
                {
                    результат = ОбслуживаемыйПРимитив.ВыполнитьКоманду((Команда)команда.Параметры[0]);
                }
                // если это группа то дайОбъект дополняется  ДайОбъект(номер), ДайЧастьОбъектов (начало, конец)
                // НаОбъет(номер, объект) На ЧастьОбъектов(начало, конец, группаОбъектов) - это команды к Группе, не нужны
                // есть еще потоки ДайДанныеПотока - здесь надо связь сохранить и даже поддерживать отправлять данные и прослушивать паралельно входящие команды
                // хотя в команду ДанныеПотока передается адрес куда давать или сам поток и там в отдельном логпроцессе идет передача
                // ВОЗМОЖНО нужен другой объект-сервер специально для этого

                // это сообщение появляется когда у активности одновременно более одной входящей связи
                // если связь одна, то активность блокирована- никто не может внести изменение
                //
                if (команда.Имя.Значение == "СообщиОбИзмененииОбъекта") // добавь меня к событию изменения объекта , удали меня из подписки
                {
                    var обратныйАдрес = команда.Параметры[0];
                    ПодписчсикиНаСобытия.Add(обратныйАдрес);//+ сохранить запускаемое действие, действие простейшее = установить связь и все = сигнал = преывание
                    // можно добавить сюда клиент, поток
                    // режимы: сохранять связь, разорвать связь (тогда удаленный должен быть сервером)
                    // значение примитива меняется через группу, группа вносит изменение в элемент

                    результат = new СтрокаЮникода("Готово");
                }

                // попытаться отправить результат (связь может быть уже потеряна)отправить результат
                состояние = "передача";
                результат.СохранисьВ(поток);

                // завершить сеанс - сеанс может быть продлен, тогда нужны внутренние команды начала сеанса и конца (конец может быть + истечение времени ожидания)
                клиент.Close();
            }
            // закрывается процессор
        }