// Клиент в цикле ждет, получает команду, исполняет ее, возвращает результат 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(); } } } }
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)); }
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}"); }
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); // нулевая таблица несущественна } } }
/// <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); }
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)); }