Avatar billede Droa Seniormester
07. maj 2015 - 10:45 Der er 4 kommentarer og
1 løsning

Passiv læsning fra NetworkStream

Hej Eksperter.

Jeg sidder og skal lave en lille async XMPP server.

Jeg bruger en NetworkStream til og læse fra min client socket, og bruger XmlReader / XmlWriter til og intergere med streamen.

Jeg gad dog godt have en form for debug læsning, så jeg kan se hvad der sker på min stream, da XMPP dokumentationen på xmpp.org er lidt ukompatibel med de fleste xmpp clienter jeg tester oppe imod.

Som det har været indtil nu, har jeg brugt wireshark, men det har været en del roddet og søge rundt i de pakker, for at finde ud af hvor den fejler.

er der en måde og læse en stream 2 gange, af 2 forskellige readers?

min XmlReader har en XmlReaderSetting der gør at input ikke lukker, for at der ikke sker en formaterings fejl (siden XMPP læses som et xml dokument over en længer periode, som ikke har et lukkende tag, før socket lukker).

håber nogen kan hjælpe :)
Avatar billede arne_v Ekspert
08. maj 2015 - 03:16 #1
Til inspiration:


using System;
using System.IO;
using System.Text;
using System.Xml;

namespace E
{
    public class LoggingStreamReader : StreamReader
    {
        private TextWriter log;
        public LoggingStreamReader(Stream stm, TextWriter log) : base(stm)
        {
            this.log = log;
        }
        public override int Read()
        {
            int c = base.Read();
            log.Write((char)c);
            return c;
        }
        public override string ReadLine()
        {
            string line = base.ReadLine();
            log.WriteLine(line);
            return line;
        }
        public override int Read(char[] buffer, int index, int count)
        {
            int n = base.Read(buffer, index, count);
            String s = new String(buffer, index, n);
            log.Write(s);
            return n;
        }
        // more methods may need to be overriden
    }
    public class LoggingStreamWriter : StreamWriter
    {
        private TextWriter log;
        public LoggingStreamWriter(Stream stm, TextWriter log) : base(stm)
        {
            this.log = log;
        }
        public override void Write(char c)
        {
            log.Write(c);
            base.Write(c);
        }
        public override void WriteLine(string line)
        {
            log.WriteLine(line);
            base.WriteLine(line);
        }
        public override void Write(char[] buffer)
        {
            log.Write(buffer);
            base.Write(buffer);
        }
        public override void Write(char[] buffer, int index, int count)
        {
            log.Write(buffer, index, count);
            base.Write(buffer, index, count);
        }
        public override void Write(string format, params object[] arg)
        {
            log.Write(format, arg);
            base.Write(format, arg);
        }
        public override void WriteLine(string format, params object[] arg)
        {
            log.WriteLine(format, arg);
            base.WriteLine(format, arg);
        }
        // more methods may need to be overriden
    }
    public class Program
    {
        public static void TestRead(Stream stm)
        {
            using(StreamReader sr = new StreamReader(stm))
            {
                using(XmlReader xr = XmlTextReader.Create(sr))
                {
                    while(xr.Read())
                    {
                        Console.WriteLine("{0} {1} {2}", xr.NodeType, xr.Name, xr.Value);
                    }
                }
            }
           
        }
        public static void TestLoggingRead(Stream stm)
        {
            using(StreamReader sr = new LoggingStreamReader(stm, Console.Out))
            {
                using(XmlReader xr = XmlTextReader.Create(sr))
                {
                    while(xr.Read())
                    {
                        Console.WriteLine("{0} {1} {2}", xr.NodeType, xr.Name, xr.Value);
                    }
                }
            }
           
        }
        public static void TestRead(string xmlstr)
        {
            TestRead(new MemoryStream(Encoding.UTF8.GetBytes(xmlstr)));
            TestLoggingRead(new MemoryStream(Encoding.UTF8.GetBytes(xmlstr)));
        }
        public static void TestWrite(Stream stm)
        {
            using(StreamWriter sw = new StreamWriter(stm))
            {
                using(XmlWriter xw = XmlTextWriter.Create(sw))
                {
                    xw.WriteStartDocument();
                    xw.WriteStartElement("test");
                    xw.WriteString("bla bla");
                    xw.WriteEndElement();
                    xw.WriteEndDocument();
                }
            }
        }
        public static void TestLoggingWrite(Stream stm)
        {
            using(StreamWriter sw = new LoggingStreamWriter(stm, Console.Out))
            {
                using(XmlWriter xw = XmlTextWriter.Create(sw))
                {
                    xw.WriteStartDocument();
                    xw.WriteStartElement("test");
                    xw.WriteString("bla bla");
                    xw.WriteEndElement();
                    xw.WriteEndDocument();
                }
            }
        }
        public static void TestWrite()
        {
            MemoryStream ms;
            ms = new MemoryStream();
            TestWrite(ms);
            Console.WriteLine(Encoding.UTF8.GetString(ms.GetBuffer()));
            ms = new MemoryStream();
            TestLoggingWrite(ms);
            Console.WriteLine(Encoding.UTF8.GetString(ms.GetBuffer()));
        }
        public static void Main(string[] args)
        {
            TestRead("<all><elm>1</elm><elm>2</elm><elm>3</elm></all>");
            TestWrite();
            Console.ReadKey();
        }
    }
}
Avatar billede Droa Seniormester
08. maj 2015 - 07:43 #2
Mange tak for det meget gode svar, jeg kan se ideen i det, og forstår ikke helt hvorfor jeg ikke selv kom på den idé, det er jo ret åbenlyst på en måde :)

laver du et svar?
Avatar billede arne_v Ekspert
08. maj 2015 - 14:39 #3
svar
Avatar billede arne_v Ekspert
08. maj 2015 - 14:40 #4
Uden ioevrigt at sammenligne:

http://en.wikipedia.org/wiki/Egg_of_Columbus

:-)
Avatar billede Droa Seniormester
08. maj 2015 - 15:14 #5
haha.. det lyder nu meget rigigt..point godt givet ud.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester