// можно создать разреженный объект поток и распихать его в дыры public MemoryStream ЗаписатьВВиртуальныйПоток(АМОбъект примитив) // { var виртПоток = new MemoryStream(); var писатель = new BinaryWriter(виртПоток); var кодТипа = Хранилище.кодыТипов[примитив.GetType()]; писатель.Write(кодТипа); примитив.СохранисьВ(Писатель); return(виртПоток); }
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(); } // закрывается процессор }