Laden...

Datenübertragung zu PHP-Seite

Erstellt von Nexus633 vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.204 Views
N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren
Datenübertragung zu PHP-Seite

Hallo liebe Community,
mittlerweile muss ich euch wieder um Rat fragen. Wie bereits in zu vor geschriebenen Beiträgen erwähnt, schreibe ich an einem Windows Deamon, den esdem Anwender ermöglichen soll Gameserver über eine Schnittstelle zu PHP (Andere Sprachen sind auch möglich), zu Installieren sowie zu verwalten.

Sprich: Installieren, Deinstallieren, Starten, Stoppen, Restarten, Config Ändern, Screenlog Lesen (Batchlog), Backups, etc...

Das grundgerüst steht bereits und die meisten Funktionen sind vorhanden und Betriebsbereit. Nun bin ich an den Datein. Der Anwender möchte natürlich auch Configurationen am Server vornehmen, diesgeschiet meist über Configfiles.

Wenn Ich nun die Datei Einlese (Siehe Anhang), fehlt direkt die 1 Zeile. Wenn ich diese nun Speichere (ich lasse mir eine MessageBox ausgeben mit dem Inhalt), sieht man in der Box (siehe Anhang), das ich 1zu1 diese Daten Empfage. Lade ich nun die Datei neu, fehlt allerdings die 1Zeile und es wurde unten was hinzugefügt... (siehe Anhang). Wie kommt das zustande.

Ich nutze folgenden Code:


/* Lesen */
         private void GetConfigContent()
        {
            if(!isGameserverExists())
            {
                return;
            }

            using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                string flines = "";
                string curline;
                int lineno = 0;
                int lines = 0;
                int lastlines = 50;

                try
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (reader.ReadLine() != null)
                        {
                            lines++;

                            while ((curline = reader.ReadLine()) != null)
                            {
                                lineno++;
                                if (lines < lastlines)
                                    lastlines = lines;
                                if (lineno >= (lines - lastlines))
                                {
                                    flines += curline + Environment.NewLine;
                                }
                            }
                        }
                        reader.Close();
                    }
                    stream.Close();
                }
                catch (FileLoadException Fex)
                {
                    this.GetConfig = "Beim Lesen der Screenlog ist ein Fehler aufgetreten: " + Fex.Message;
                }
                this.GetConfig = flines;
            }
        }
        
        /* Schreiben */
        private void SetConfigContent()
        {
            System.Windows.Forms.MessageBox.Show(this.SetConfig);
            try
            {
                using (StreamWriter myFile = new StreamWriter(this.PathToCFG))
                {
                    myFile.Write(this.SetConfig);
                    myFile.Close();
                    this.SetConfig = "OK";
                }
            }
            catch
            {
                this.SetConfig = "NOK";
            }

        }

Ich habe auch eine andereMethode Probiert.


         /* Schreiben 2# */
         private void SetConfigContent()
         {
             using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Write, FileShare.Write))
             {
                 try
                 {
                     using (StreamWriter writer = new StreamWriter(stream, System.Text.Encoding.UTF8))
                     {
                         writer.Write(this.SetConfig);
                         writer.Flush();
                         writer.Close();
                         this.SetConfig = "OK";
                     }
                 }
                 catch(FileLoadException ex)
                 {
                     this.SetConfig = "NOK - FileLoadException: " + ex.Message;
                 }
                 catch (FieldAccessException ex)
                 {
                     this.SetConfig = "NOK - FieldAccessException: " + ex.Message;
                 }
                 catch (FileNotFoundException ex)
                 {
                     this.SetConfig = "NOK - FileNotFoundException: " + ex.Message;
                 }
                 stream.Close();
             }
         }

Egal wie ich es mache, es bringt nicht das Resultat was ich erstrebe. Was mache ich falsch ?

Wird noch Code benötigt, einfach bescheid geben. 😃

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren
N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

und der letzte Anhang:

Wenn es eine Möglichkeit gibt mehrere Anhänge anzufügen, dann sgt es mir bitte 😃

S
417 Beiträge seit 2008
vor 8 Jahren

Hallo,

du liest ja mit while (reader.ReadLine() != null) die erste Zeile, aber speicherst Sie nicht. Daher taucht sie bei dir nicht auf.

771 Beiträge seit 2009
vor 8 Jahren

Warum hast du überhaupt eine doppelt-verschachtelte Leseschleife?

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

danke für die schnelle Antwort. Nachdem man das so Liest klingt es Plausibel aber


if (lines == 0)
{
    System.Windows.Forms.MessageBox.Show(reader.ReadLine());
    flines += reader.ReadLine() + Environment.NewLine;
}
lines++;

Damit habe ich mir die 1Zeile in flines gespeichert und zuvor ausgegeben. Das Passt alles 😃 Ich erhalte es aber nicht auf der Seite...

Da fehlt Sie einfach. Kann es sein das mein Code richtig ist, der von PHP aber nicht ?

Weil ich zuvor nicht alles ausgegeben bekomme habe... Ich sende immer 1001 Byte an den gegenüber bis alle zeilen leehr sind.

So habe ich es hinbekommen das alles gesendet wird. Bis auf die erste Zeile...

S
417 Beiträge seit 2008
vor 8 Jahren

Damit habe ich mir die 1Zeile in flines gespeichert und zuvor ausgegeben. Das Passt alles 😃

Das was du da machst passt eben nicht. Du rufst zweimal reader.ReadLine() auf, d.h. du liest hier die ersten beiden Zeilen. Die erste speicherst du nicht, sondern gibst es nur in der MessageBox aus.

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

mit


flines += reader.ReadLine() + Environment.NewLine;

Speichere ich diese doch in "flines " ?!?

Ok, dann anders gefragt. Wie bekomme ich die erste Zeile gespeichert ?

F
10.010 Beiträge seit 2004
vor 8 Jahren

Nachdenken.


if (lines == 0)
{
    System.Windows.Forms.MessageBox.Show(reader.ReadLine());
    flines += reader.ReadLine() + Environment.NewLine;
}
lines++;

Wie viele Zeilen liest du hier?
Und was machst du damit?

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

Dort lese ich die erste Zeile (meines wissens).


         private void GetConfigContent()
        {
            if(!isGameserverExists())
            {
                return;
            }

            using (FileStream stream = File.Open(PathToCFG, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                string flines = "";
                string curline;
                int lineno = 0;
                int lines = 0;
                int lastlines = 50;

                try
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        while (reader.ReadLine() != null)
                        {
                            if (lines == 0)
                            {
                                 System.Windows.Forms.MessageBox.Show(reader.ReadLine());
                                 flines += reader.ReadLine() + Environment.NewLine;
                             }
                             lines++;

                            while ((curline = reader.ReadLine()) != null)
                            {
                                lineno++;
                                if (lines < lastlines)
                                    lastlines = lines;
                                if (lineno >= (lines - lastlines))
                                {
                                    flines += curline + Environment.NewLine;
                                }
                            }
                        }
                        reader.Close();
                    }
                    stream.Close();
                }
                catch (FileLoadException Fex)
                {
                    this.GetConfig = "Beim Lesen der Screenlog ist ein Fehler aufgetreten: " + Fex.Message;
                }
                this.GetConfig = flines;
            }
        }

Danach lese ich mit Curline die nächsten Zeilen bis null kommt.

P
1.090 Beiträge seit 2011
vor 8 Jahren
while (reader.ReadLine() != null) //<- 1. Zeile Lesen
                        {
                            if (lines == 0)
                            {
                                 System.Windows.Forms.MessageBox.Show(reader.ReadLine());//<- 2. Zeile Lesen
                                 flines += reader.ReadLine() + Environment.NewLine;//<- 3. Zeile Lesen
                             }
                             lines++;

                            while ((curline = reader.ReadLine()) != null)
                            {
                                lineno++;
                                if (lines < lastlines)
                                    lastlines = lines;
                                if (lineno >= (lines - lastlines))
                                {
                                    flines += curline + Environment.NewLine;
                                }
                            }
                        }

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

och nein, wie Peinlich.... Ja ne ist klar, sorry und Danke...

oha das glaube ich jetzt nicht... arrrrggg.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Probier mal.


while(! reader.EndOfStream)
{
...
}

😉

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

Top, Merci... Ich sage ja das war so ein leichtsinniger fehler oO oO.. Funktioniert nun...

Kurz noch was anderes. Wenn ich die Ausgabe erhalte, erhalte ich zwischendurch komische ? in einem kästchen. (Siehe Anhang). Liegt es an PHP oder an C# ?

ich lese mit


System.Text.Encoding.UTF8

aus. Habe auch schon andere arten wie ANCII sowie Unicode versucht. Default auch, das aber UTF8...
Ich bin da Ratlos ^^... Das darf nicht sein.

Jemand eine Idee...

P
1.090 Beiträge seit 2011
vor 8 Jahren

Schau doch einfach welche Zeichen an der stelle in der Datei steht und googel dann nach C# Zeichen und Encoding. Solltest du alleine hinbekommen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

Da steht nichts drinne. Das ? im True sowie die anderen sind einfach da...
Im Byte ist nichts und sonst auch nirgends... Sie kommen einfach 😃

Aber das werde ich weiterhin machen 😃 Ich suche wie wild und teste ^^

F
10.010 Beiträge seit 2004
vor 8 Jahren

Bicht wild rummachen, sondern systematisch.

Nimm einen HexEditor und schau die Datei genau an, dann siehst du was für Zeichen das sind.
Die entstehen nicht aus der Luft.

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

@FZelle

Bicht wild rummachen, sondern systematisch.

Nimm einen HexEditor und schau die Datei genau an, dann siehst du was für Zeichen das sind.
Die entstehen nicht aus der Luft.

Das habe ich gemacht, nichts was diese Zeichen verursacht konnte ich finden.
Auch eine Datei (neu erstellt -> Rechtsklick -> Neu -> Textdokument) mit dem Zeichen A gibt mir diese Zeichen...

Kann das sein das esreste aus dem ByteArray des TCP´s sind ?

Meine übergabe an PHP:


        public void SendResponse(string response, object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            ASCIIEncoding encoder = new ASCIIEncoding();
            if (response == null)
            {
                response = "Keine Anfrage zum bearbeiten !";
            }

            byte[] buffer; // Buffer = alles
            byte[] bufferlen;


            buffer = encoder.GetBytes(response);
            bufferlen = encoder.GetBytes(response.Length.ToString());
            // Teile dem PHP-Skript mit, wie viele Bytes nun kommen.
            clientStream.Write(bufferlen, 0, bufferlen.Length);
            clientStream.Flush();

            if (response.Length / 1000 == 0)
            {
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
                return;
            }

            float packs = response.Length / 1000;
            int bytessent = 0;

            int sendbytes = 1000;
            for (int i = 0; i <= packs; i++) // Schleife für die Pakete
            {
                byte[] smallbuf = new byte[1001]; // Smallbuf = bytes fürs paket
                // Wenn beim letzten Paket, dann reduziere die zu sendenden Bytes, sodass er keine NullPointerException bekommt.
                if (i == packs)
                    sendbytes = response.Length - bytessent;
                // Schreibe die Bytes in das Paket
                for (int j = 0; j < sendbytes; j++) // Schleife für die Byte pro Paket
                {
                    smallbuf[j] = buffer[i * 1000 + j]; // I = Offset number des Pakets ; j stelle innerhalb des Pakets 
                }
                bytessent += smallbuf.Length - 1; // Setze zähler hoch
                // Sende Paket los
                clientStream.Write(smallbuf, 0, smallbuf.Length);
                clientStream.Flush();
                //string str4debug = Encoding.ASCII.GetString(smallbuf);
            }

        }

Ich bin am verzweifeln ^^.
Danke für eure Hilfe

16.835 Beiträge seit 2008
vor 8 Jahren

Ganz banale Frage: wieso suchst Du Dir nicht ein Übertragungsmedium/protokoll aus, das solche Fehler kategorisch von Haus aus ausschließt?
zB einen Json REST-Service?

Die Umsetzung ist viel einfacher, stabiler und das Gesamtkonstrukt deutlich weniger Anfällig für Fehler.

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

danke für die Info. 😃

Das ist wesendlich besser und leichter zu verwenden. Ich habe nun ein kleines Projekt unter http://www.codeproject.com gefunden.

ich habe noch nie damit gearbeitet, schaut aber sehr interesannt aus 😃

Könntet ihr mir ein kleines Feedback zu dem sagen ?

http://www.codeproject.com/Articles/167159/How-to-create-a-JSON-WCF-RESTful-Service-in-sec

Danke euch.

5.658 Beiträge seit 2006
vor 8 Jahren

Hi Nexus633,

Könntet ihr mir ein kleines Feedback zu dem sagen ?

Wie meinst du das? Was genau ist deine Frage dazu? Hast du es überhaupt schonmal gelesen und ausprobiert?

Bitte beachte unbedingt unseren [Hinweis] Wie poste ich richtig?, Punkt 1, 4 und 5!

Christian

Weeks of programming can save you hours of planning

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

war vielleicht ein wenig forsch ausgedrückt. Ich wollte lediglich ein kleines Feedback über die Json REST-Service erhalten, wie die Leute damit zurechtkommen und ob es da was zu beachten gibt oder nicht. Sicherlich verwende ich die Suche und schaue regelmäßig in eure Artikel und Tutos.

  1. Wie meinst du das? 2. Was genau ist deine Frage dazu? 3.Hast du es überhaupt schon mal gelesen und ausprobiert?

zu 1. Ein kleine Feedback halt, Erfahrungen und Umgang mit der REST.
zu 2. Das habe ich bereits beantwortet und sollte aus dem Thread heraus bekannt sein.
zu 3. Ja habe ich, ich habe auch gepostet was ich dazu gefunden und mit was ich angefangen habe zu testen.

ich habe mich meines Wissens nach, an den Hinweis gehalten.
Ich habe weder nach einer Komplett Lösung gefragt, mein Titel ist aussagekräftig und wie bereits gesagt habe ich gesucht und was gefunden worauf ich ein Feedback haben wollte.

Ich hoffe nun ist es vom Tisch 😃 und wir können uns wieder dem Thema widmen.