Example #1
0
 // Клиент в цикле ждет, получает команду, исполняет ее, возвращает результат
 public async Task Worker(TcpClient client)
 {
     using (Stream bstream = new BufferedStream(client.GetStream()))
     {
         System.IO.BinaryReader reader = new System.IO.BinaryReader(bstream);
         System.IO.BinaryWriter writer = new System.IO.BinaryWriter(bstream);
         //byte[] buff = new byte[1024];
         for (; ;)
         {
             // Получаем команду
             int command = reader.ReadByte();
             //if (b == 255) b = reader.ReadInt32(); // Расширение системы команд
             // Принимаем таблицу
             int    tab    = reader.ReadInt32();
             var    typtyp = tass[tab].signatures[command];
             object ob     = ByteFlow.Deserialize(reader, typtyp.Item1); //PaCell.GetPO(typtyp.Item1, reader);
             object res    = execute_command(command, tab, ob);
             // проверка корректности пустого результата
             if ((res == null) != (typtyp.Item2.Vid == PTypeEnumeration.none))
             {
                 throw new Exception("Err: result is not null or sould ne null");
             }
             if (typtyp.Item2.Vid != PTypeEnumeration.none)
             {
                 ByteFlow.Serialize(writer, res, typtyp.Item2); //PaCell.SetPO(typtyp.Item2, writer, res);
                 bstream.Flush();
             }
         }
     }
 }
Example #2
0
        public void TestPaCellInit()
        {
            // чистим
            cell.Clear();
            // заполняем
            cell.Fill(new object[] { 7777, "Pupkin Vasya", 0.0001 });
            cell.Flush();
            // читаем
            object oval = cell.Root.Get();

            Assert.AreEqual(tp_rec.Interpret(oval), "{7777,\"Pupkin Vasya\",0.0001}");
            // читаем поле
            oval = cell.Root.Field(1).Get();
            Assert.IsTrue(oval is string);
            Assert.IsTrue((string)oval == "Pupkin Vasya");
            // читаем другое поле
            oval = cell.Root.Field(2).Get();
            Assert.IsTrue((double)oval == 0.0001);
            // Читаем десериализацией
            PaEntry ent    = cell.Root.Field(0);
            long    offset = ent.offset;

            Assert.IsTrue(offset == 32L, "offset: " + offset);
            BinaryReader br = new BinaryReader(ss);

            ss.Position = offset;
            object bval = ByteFlow.Deserialize(br, new PType(PTypeEnumeration.integer));

            Assert.IsTrue((int)bval == 7777, "" + (int)bval);
            // читаем запись
            ss.Position = offset;
            bval        = ByteFlow.Deserialize(br, tp_rec);
            Assert.IsTrue(tp_rec.Interpret(bval) == "{7777,\"Pupkin Vasya\",0.0001}", tp_rec.Interpret(bval));

            // повторно, но с русским текстом
            cell.Clear();
            cell.Fill(new object[] { 7777, "Pupkin Вася", 0.0001 });
            ss.Position = offset;
            bval        = ByteFlow.Deserialize(br, tp_rec);
            Assert.IsTrue(tp_rec.Interpret(bval) == "{7777,\"Pupkin Вася\",0.0001}", tp_rec.Interpret(bval));

            // теперь синтезирую значение ячейки
            cell.Clear();
            BinaryWriter bw = new BinaryWriter(ss);

            ss.Position = offset;
            bw.Write(7777);
            bw.Write("Pupkin Vasya");
            bw.Write((double)0.0001);
            bw.Flush();
            oval = cell.Root.Get();
            Assert.IsTrue(tp_rec.Interpret(oval) == "{7777,\"Pupkin Vasya\",0.0001}", tp_rec.Interpret(oval));

            // Теперь по-другому, через сериализацию
            cell.Clear();
            ss.Position = offset;
            ByteFlow.Serialize(bw, new object[] { 7777, "Pupkin Vasya", 0.0001 }, tp_rec);
            oval = cell.Root.Get();
            Assert.IsTrue(tp_rec.Interpret(oval) == "{7777,\"Pupkin Vasya\",0.0001}", tp_rec.Interpret(oval));
        }
Example #3
0
        public void TestBinarySerialize()
        {
            MemoryStream mem = new MemoryStream();
            BinaryWriter bw  = new BinaryWriter(mem);
            BinaryReader br  = new BinaryReader(mem);

            ByteFlow.Serialize(bw, new object[] { 777, "Pupkin", 9.9999 }, tp_rec);
            bw.Flush();
            mem.Position = 0L;
            object oval = ByteFlow.Deserialize(br, tp_rec);
            string val  = tp_rec.Interpret(oval);

            Assert.AreEqual(val, "{777,\"Pupkin\",9.9999}");
        }
Example #4
0
        private void LoadConfiguration()
        {
            //PaCell scell = new PaCell(ConfigObject.tp, path + "configuration.pac", false);
            //object[] conf = (object[])scell.Root.Get();
            //configuration = conf;
            //scell.Close();
            string p  = path + "configuration.bin";
            var    fs = File.Open(p, FileMode.Open);

            configuration = (object[])ByteFlow.Deserialize(new BinaryReader(fs), ConfigObject.tp);

            if (ismaster)
            { // Послать приказ другим. TODO: надо бы сделать посылку конфигурации, тогда можно будет от мастера "плясать"???
                int nnodes = ((object[])configuration[1]).Count();
                for (int nd = 1; nd < nnodes; nd++)
                {
                    indicomm.Order(nd - 1, _loadconfiguration, 0, null); // нулевая таблица несущественна
                }
            }
        }
Example #5
0
        /// <summary>
        /// в канал посылается команда, у которой есть параметры: таблица и сообщение
        /// </summary>
        /// <param name="chan"></param>
        /// <param name="command"></param>
        /// <param name="tab"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public object Order(int chan, int command, int tab, object message)
        {
            IndividualChannel ch = masterchannels[chan];
            // Определяем сигнатуру
            var typtyp = tass[tab].signatures[command];

            ch.bw.Write((byte)command);
            // посылаем таблицу
            ch.bw.Write(tab);
            // посылаем посылку
            //PaCell.SetPO(typtyp.Item1, ch.bw, message);
            ByteFlow.Serialize(ch.bw, message, typtyp.Item1);
            ch.Flush();
            object res = null;

            // Если нужно, принимаем результат
            if (typtyp.Item2.Vid != PTypeEnumeration.none)
            {
                res = ByteFlow.Deserialize(ch.br, typtyp.Item2); // PaCell.GetPO(typtyp.Item2, ch.br);
            }
            return(res);
        }
Example #6
0
        public static void Test()
        {
            PType tp_point = new PTypeRecord(
                new NamedType("x", new PType(PTypeEnumeration.real)),
                new NamedType("y", new PType(PTypeEnumeration.real)));
            PType tp_figure = new PTypeUnion(
                new NamedType("nothing", new PType(PTypeEnumeration.none)),
                new NamedType("point", tp_point),
                new NamedType("polygon", new PTypeSequence(tp_point)),
                new NamedType("circle", new PTypeRecord(
                                  new NamedType("center", tp_point),
                                  new NamedType("radius", new PType(PTypeEnumeration.real)))));
            PType  tp_sequ = new PTypeSequence(tp_figure);
            object sequ    = new object[]
            {
                new object[] { 1, new object[] { 3.5, 7.8 } },
                new object[] { 2, new object[] {
                                   new object[] { 0.0, 0.0 }, new object[] { 1.0, 0.0 }, new object[] { 1.0, 1.0 }, new object[] { 0.0, 1.0 }
                               } },
                new object[] { 3, new object[] { new object[] { 5.0, 5.0 }, 4.99 } }
            };

            // Выполним текстовую сериализацию
            TextFlow.Serialize(Console.Out, sequ, tp_sequ);
            Console.WriteLine();
            // Создадим Stream, сделаем бинарную сериализацию, будем считать, что это файл
            Stream stream = new MemoryStream();

            ByteFlow.Serialize(new BinaryWriter(stream), sequ, tp_sequ);
            // Десериализуем стрим (бинарный файл)
            stream.Position = 0L;
            object sequ_1 = ByteFlow.Deserialize(new BinaryReader(stream), tp_sequ);

            // Проверим полученное значение
            Console.WriteLine(tp_sequ.Interpret(sequ_1));
        }