Zum Inhalt springen

System.Console.ReadLine Redirection - wie?


Empfohlene Beiträge

Geschrieben

Hallo Commy!

ich habe ein blödes -wohl auch simples- Problem.

Ich habe im Internet gesucht, wie man System.Console.Write und System.Console.WriteLine auf eine Textbox einer Form (bzw Gui) ausgeben lassen kann. Habe ich auch gefunden und funktioniert super.

( How to redirect the Console’s output to a TextBox in C# « Le Bash Blog )

Nur wie bekomme ich es jetzt hin, dass das System.Console.ReadLine auch in einer seperaten "txtboxInbox" funktioniert?

Ich habe einen Server programmiert, der auf einen "stop" befehl wartet, wenn ich den Server stoppen will.

CodeSnippet:


String strCmd = "";

while (!strCmd.ToLower().Equals("stop"))

            {

                strCmd = Console.ReadLine();

                if (!strCmd.ToLower().Equals("stop"))

                    Console.WriteLine("Unbekannter Befehl: " + strCmd);

            }
strCmd ist jedoch
null

weil strCmd ja mit Console.ReadLine überschrieben wird. Aber die Console kann ja von nix einlesen.

Wie bekomme ich das jetzt am günstigsten hin?

Danke schonmal für die Hilfe!

Geschrieben

Bin schon weitergekommen! Habe mir eine neue Klasse geschrieben:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Windows.Forms;


namespace ServerGui

{

    public class TextBoxStreamReader : TextReader

    {

        TextBox _input = null;

        public TextBoxStreamReader(TextBox input)

        {

            _input = input;

        }


        public override void ReadLine()

        {

            base.ReadLine();

            _input.Text;

        }


        public override Encoding Encoding

        {

            get { return System.Text.Encoding.UTF8; }

        }

    }

}

bin mir aber bei dem
base.ReadLine();

_input.Text;

nicht so sicher ob das passt.... könntet ihr mir helfen?

Geschrieben (bearbeitet)

Wieso kann ich meine beiträge nicht editieren? manno -.-

Die methode ist falsch ist mir aufgefallen. Sie sollte einen String zurückgeben.

Hier nochmal der neue Code:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Windows.Forms;


namespace ServerGui

{

    public class TextBoxStreamReader : TextReader

    {

        TextBox _input = null;

        public TextBoxStreamReader(TextBox input)

        {

            _input = input;

        }


        public override void ReadLine()

        {

            base.ReadLine();

            return _input.Text;

        } 

    }

}

€: war ja klar diesen kann man editieren.... hachja die anderen gehen nicht tut mir leid!

Bearbeitet von CKroencke
Geschrieben

warum leitest du die Aus- und Eingaben der Konsole um?

wenn dein Programm gut strukturiert ist, dürfte es einfach werden, die Oberfläche auszuwechseln (statt der Konsole eine grafische Oberfläche verwenden)

warum also dieser Workaround?

Geschrieben

ich bin halt wie gesagt noch am anfang con C' und das vorherige Java hat mich "gelehrt" immer in vielen klassen zu arbeiten.

Die Serverklasse sieht so aus:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net.Sockets;

using System.IO;

using System.Collections;

using System.Threading;


namespace ClientServerV2.ServerGui

{



    public class Server

    {

        private int _port = 0;

        //Listener initialisieren

        TcpListener listener = null;

        // Die Liste der laufenden Server-Threads

        ArrayList serverThreads = new ArrayList();


        //Standard Konstruktor

        public Server(int port)

        {

            _port = port;

            start();

        }




        public void start()

        {

            bool tmpLoop = true;

            // Listener initialisieren und starten

            listener = new TcpListener(_port);

            listener.Start();


            // Haupt-Server thread initialisieren und starten

            Thread mainThread = new Thread(new ThreadStart(Run));

            mainThread.Start();

            Console.WriteLine("Server Started");

            // Benutzerbefehle entgegennehmen

            String strCmd = "";

            while (!strCmd.ToLower().Equals("stop"))

            {

                strCmd = Console.ReadLine();

                Thread.Sleep(500);

                if (!strCmd.ToLower().Equals("stop"))

                    Console.WriteLine("Unbekannter Befehl: " + strCmd);

            }

            // Haupt-Server-Thread stoppen

            mainThread.Abort();

            // Alle Server-Threads stoppen

            for (IEnumerator e = serverThreads.GetEnumerator(); e.MoveNext(); )

            {

                // Nächsten Server-Thread holen

                ServerThread st = (ServerThread)e.Current;

                //und stoppen

                st.stop = true;

                while (st.running)

                {

                    Thread.Sleep(1000);

                }

            }

            // Listener Stoppen

            listener.Stop();

        }


        // Haupthread des Servers

        // Nimmt die Verbindungswünsche von Clients entgegen

        // und startet die Server-Threads für die Clients

        public void Run()

        {

            while (true)

            {

                // Warten bis ein Client eine verbindung wünscht

                TcpClient c = listener.AcceptTcpClient();


                // Initialisiert und startet einen Server-Thread 

                // und fügt ihn zur Liste der Server-Threads hinzu

                serverThreads.Add(new ServerThread(c));

            }

        }

    }


}
Und die 2. Klasse:
using System;

using System.Collections.Generic;

using System.Text;

using System.Net.Sockets;

using System.Threading;

using System.IO;


namespace ClientServerV2.ServerGui

{

    class ServerThread

    {

        //Stop Flag

        public bool stop = false;

        // Flag für Thread läuft

        public bool running = false;

        // Die Verbindung zum Client

        TcpClient _connection = null;


        public ServerThread(TcpClient connection)

        {

            // Speichert die Verbindung zu dem Client

            // um diese Später zu schließen

            _connection = connection;

            new Thread(new ThreadStart(Run)).Start();

            Console.WriteLine("Client connected: "+ _connection.Client.LocalEndPoint);


        }



        // Der eigentliche Thread

        public void Run()

        {

            // Flag setzen für "Thread Läuft"

            this.running = true;

            // Hole den Stream fürs schreiben

            Stream outStream = _connection.GetStream();

            String strBuf = null;

            bool loop = true;


            while (loop)

            {

                try

                {

                    // Hole die aktuelle Zeit als String

                    String strTime = DateTime.Now.ToString();


                    // Sende die Zeit nur wenn sie sich von der 

                    // vorherigen unterscheided

                    if (!strTime.Equals(strBuf))

                    {

                        // Wandele den Zeitstring in ein Byte-Array um

                        // Es wird noch ein Carriage-Return-Linefeed angefügt

                        // so daß das Lesen auf Client-Seite einfacher wird

                        Byte[] sendBytes = Encoding.ASCII.GetBytes(strTime + "\r\n");


                        // Sende die Bytes zum Client

                        outStream.Write(sendBytes, 0, sendBytes.Length);


                        //Merke die Zeit

                        strBuf = strTime;


                    }

                    loop = !this.stop;

                }

                catch ( Exception )

                {

                    // oder bis ein fehler auftritt

                    loop = false;

                }

            }

            // Schließe die verbindung zum Client und setze Thread Läuft zurück

            _connection.Close();

            running = false;

        }


        public void sendOpenCD()

        {

            String strOpenCD = "func1";

            Stream sendStream = _connection.GetStream();

            Byte[] sendByte = Encoding.ASCII.GetBytes(strOpenCD);

            sendStream.Write(sendByte, 0, sendByte.Length);

        }


    }

}

Ich möchte in der Serverklasse (Konsolenanwendung) etwas schreiben (Console.WriteLine();) bzw einfach die ausgaben von dem Server (ich möchte auch ausgeben wenn sich ein Client Verbindet)umlenken auf die GUI. Ich Instanziiere von der Gui aber die Serverklasse und sonst würde sich eine schleife bilden. Ich hatte schon oft solche probleme....

einfall: kann ich nicht in der Serverklasse einfach eine return string methode schreiben, diese in der GUI klasse aufrufen und als Text in die Textbox schreiben? wie mache ich das dann aber mit den ausgaben wiederrum... zu kompliziert für mich :D

Geschrieben

aber was hat die Anzahl der Klassen mit der Art der Oberfläche zu tun?

wenn du später ausschließlich die Ein- und Ausgaben der Konsole auf die grafische Oberfläche umleiten willst, dann hast du wieder nur den Funktionsumfang einer Konsole, also warum dann Ein- und Ausgabe umleiten?

du könntest dir eine abstrakte Klasse oder ein Interface definieren, welches festlegt, welche Eigenschaften eine Ausgabe (die GUI oder die Konsole) haben muss und eine/eins, für die Eingaben

danach könntest du für die GUI und für die Konsole eine Klasse von der Ausgabeklasse/dem Ausgabeinterface ableiten, die das entsprechende Verhalten implementieren und dem Server so viele Objekte zuweisen, wie es notwendig ist

von der Eingabeklasse/dem Eingabeinterface erzeugst du 1 Objekt, welches die Eingaben über die grafische Oberfläche erwartet und weist dies dem Server zu

ein Umleiten der Ein- und Ausgaben ist dadurch nicht mehr notwendig und das Programm ist sauberer implementiert, da die Ausgabe der Daten unabhängig von der Art der Ausgabe abläuft

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...