CKroencke Geschrieben 16. November 2011 Geschrieben 16. November 2011 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! Zitieren
CKroencke Geschrieben 16. November 2011 Autor Geschrieben 16. November 2011 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? Zitieren
CKroencke Geschrieben 16. November 2011 Autor Geschrieben 16. November 2011 (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 16. November 2011 von CKroencke Zitieren
Sacaldur Geschrieben 17. November 2011 Geschrieben 17. November 2011 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? Zitieren
CKroencke Geschrieben 18. November 2011 Autor Geschrieben 18. November 2011 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 Zitieren
Sacaldur Geschrieben 18. November 2011 Geschrieben 18. November 2011 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 Zitieren
Empfohlene Beiträge
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.