public override АМОбъект Восстановить(BinaryReader читатель) { АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream); // востановление происходит в другом адресном пространстве // если это адрес из другого адресногопространства тто его можно не менятть // если локальное, то нужно добавить адрес удаленной машины return(this); }
public АМОбъект ДайОбъектПоИндексу(int номер) { ЧитательИндекса.BaseStream.Position = номер * 4; var адресОбъекта = ЧитательИндекса.ReadInt32(); Читатель.BaseStream.Position = адресОбъекта; var прим = АМОбъект.Создать(Читатель.BaseStream); return(прим); }
public override АМОбъект Восстановить(BinaryReader читатель) //востановить объект без значения из потока Хранилища { var объект = base.Восстановить(читатель); // создать пустой объект экземпляр по адресу из справочника типов Хранилища // востановить адрес дискового хранилища ЦелоеНаДиске = (ЦелоеНаДиске)АМОбъект.Создать(читатель.BaseStream); //восстановить адрес в сети Слушатель = (ТСПСвязьВходящая)АМОбъект.Создать(читатель.BaseStream); Старт(); return(this); }
public АМОбъект СоздатьКопиюОбъект(Адрес адрес) //читает только первый уровень, не лезет разбирать адреса { var фАдрес = адрес as АдресВФайле; if (фАдрес == null) { return(Пустота.Статик); } Читатель.BaseStream.Position = фАдрес.НомерБайтаВФайле; //перместить указатель на адрес объекта var прим = АМОбъект.Создать(Читатель.BaseStream); return(прим); }
public override АМОбъект Восстановить(BinaryReader читатель) { АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream); НомерВГруппе = читатель.ReadInt32(); return(this); }
public void АссинхроннаяОбработка(NetworkStream поток) // параллельно может идти запись { // var объект = АМОбъект.Создать(поток); // связь может застрять посредине чтения , если зависание больше нормы разорвать соединение // необходима синхронизация обработки данных }
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(); } // закрывается процессор }
public override АМОбъект Восстановить(BinaryReader читатель) { СписокСвязей = (ГруппаОбъектов)АМОбъект.Создать(читатель.BaseStream); return(this); }
public override АМОбъект Восстановить(Stream поток) { Параметры = (ГруппаОбъектов)АМОбъект.Создать(поток); return(this); }
public override АМОбъект Восстановить(Stream поток) { Имя = (СтрокаЮникода)АМОбъект.Создать(поток); Параметры = (ГруппаОбъектов)АМОбъект.Создать(поток); return(this); }