예제 #1
0
        public override АМОбъект Восстановить(BinaryReader читатель)
        {
            АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream);

            // востановление происходит в другом адресном пространстве
            // если это адрес из другого адресногопространства тто его можно не менятть
            // если локальное, то нужно добавить адрес удаленной машины

            return(this);
        }
예제 #2
0
        public АМОбъект ДайОбъектПоИндексу(int номер)
        {
            ЧитательИндекса.BaseStream.Position = номер * 4;
            var адресОбъекта = ЧитательИндекса.ReadInt32();

            Читатель.BaseStream.Position = адресОбъекта;
            var прим = АМОбъект.Создать(Читатель.BaseStream);

            return(прим);
        }
예제 #3
0
        public override АМОбъект Восстановить(BinaryReader читатель)
        //востановить объект без значения из потока Хранилища
        {
            var объект = base.Восстановить(читатель);

            // создать пустой объект экземпляр по адресу из справочника типов Хранилища
            // востановить адрес дискового хранилища
            ЦелоеНаДиске = (ЦелоеНаДиске)АМОбъект.Создать(читатель.BaseStream);
            //восстановить адрес в сети
            Слушатель = (ТСПСвязьВходящая)АМОбъект.Создать(читатель.BaseStream);
            Старт();

            return(this);
        }
예제 #4
0
        public АМОбъект СоздатьКопиюОбъект(Адрес адрес)   //читает только первый уровень, не лезет разбирать адреса
        {
            var фАдрес = адрес as АдресВФайле;

            if (фАдрес == null)
            {
                return(Пустота.Статик);
            }

            Читатель.BaseStream.Position = фАдрес.НомерБайтаВФайле; //перместить указатель на адрес объекта
            var прим = АМОбъект.Создать(Читатель.BaseStream);

            return(прим);
        }
예제 #5
0
 public override АМОбъект Восстановить(BinaryReader читатель)
 {
     АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream);
     НомерВГруппе      = читатель.ReadInt32();
     return(this);
 }
예제 #6
0
 public void АссинхроннаяОбработка(NetworkStream поток) // параллельно может идти запись
 {
     //
     var объект = АМОбъект.Создать(поток);  // связь может застрять посредине чтения , если зависание больше нормы разорвать соединение
     // необходима синхронизация обработки данных
 }
예제 #7
0
        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();
            }
            // закрывается процессор
        }
예제 #8
0
 public override АМОбъект Восстановить(BinaryReader читатель)
 {
     СписокСвязей = (ГруппаОбъектов)АМОбъект.Создать(читатель.BaseStream);
     return(this);
 }
예제 #9
0
 public override АМОбъект Восстановить(Stream поток)
 {
     Параметры = (ГруппаОбъектов)АМОбъект.Создать(поток);
     return(this);
 }
예제 #10
0
 public override АМОбъект Восстановить(Stream поток)
 {
     Имя       = (СтрокаЮникода)АМОбъект.Создать(поток);
     Параметры = (ГруппаОбъектов)АМОбъект.Создать(поток);
     return(this);
 }