ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
713
713
EMPFEHLEN
-
Hallo,
ich habe ein Problem mit einem StreamReader und ich habe keine ahnung warum er nicht funktioniert. Ich hoffe ihr könnt mir helfen.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; namespace VerbindungKlasseTest { static class Verbindung { // Enum das die Anfragen an den Server beschreibt public enum Status { LoginAkzeptiert, LoginAbgelehnt, RegistrationAkzeptiert, RegistrationAbgelehnt } #region Variablen // Die Variable die die aufzurufende Methode enthält internal static OnServerReceivesMessage NachrichtEmpfangenEvent; // Delegate zum aufrufen des Events internal delegate void OnServerReceivesMessage(string nachricht); // Die Verbindung zum Server private static TcpClient _server; // Zum lesen von Informationen aus dem Stream des Servers private static StreamReader _streamReader; // Zum schreiben von Informationen in den Stream des Servers private static StreamWriter _streamWriter; // Gibt an ob man Verbunden ist public static bool Verbunden { get; private set; } // Der Thread um Nachrichten zu Empfangen private static Thread _nachrichtEmpfangen; #endregion /// <summary> /// Die Verbindung zum Server aufbauen /// </summary> /// <param name="ipAddress">Die IP-Adresse des Servers</param> /// <param name="port">Der Port auf dem der Server läuft</param> public static void Verbinden(IPAddress ipAddress, int port) { // Die verbindung instanzieren und verbinden _server = new TcpClient(); _server.Connect(ipAddress, port); // Wenn man verbunden ist if (_server.Connected) { // StreamReader und Streamwriter mit dem Stream des Servers instanzieren NetworkStream stream = _server.GetStream(); _streamReader = new StreamReader(stream); _streamWriter = new StreamWriter(stream); // Gibt an das man verbunden ist Verbunden = true; // Den Thread zum Nachrichten Empfangen starten _nachrichtEmpfangen = new Thread(NachrichtEmpfangen); _nachrichtEmpfangen.Start(); } } /// <summary> /// Die Verbindung zum Server trennen /// </summary> public static void Trennen() { if (Verbunden) { try { if (_server != null) { _server.Close(); } if (_streamReader != null) { _streamReader.Close(); _streamReader.Dispose(); } if (_streamWriter != null) { _streamWriter.Close(); _streamWriter.Dispose(); } if (_nachrichtEmpfangen.IsAlive) { _nachrichtEmpfangen.Abort(); } } finally { Verbunden = false; } } } /// <summary> /// Sendet eine Nachricht an den Server /// </summary> /// <param name="nachricht">Die zusendende Nachricht</param> public static void NachrichtSenden(string nachricht) { if (!string.IsNullOrEmpty(nachricht)) { _streamWriter.WriteLine(nachricht); _streamWriter.Flush(); } } private static void NachrichtEmpfangen() { while (Verbunden) { string read = _streamReader.ReadLine(); BeiNachrichtEmpfangen(read); } } private static void BeiNachrichtEmpfangen(string nachricht) { OnServerReceivesMessage serverReceivesMessage = NachrichtEmpfangenEvent; if (serverReceivesMessage != null) { serverReceivesMessage(nachricht); } } } }
Vielen Dank im Vorraus.
MfG
Klemens
-
Was funktioniert nicht? Wie äußert sich der Fehler? Gibt es eine Fehlermeldung?
hihi = -h²
-
Es gibt keine Fehlermeldung, nur der StreamReader liest nichts vom Stream ein wenn ich von einem anderen Programm etwas sende.
-
19.04.11 14:57 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ich habe es gerade mal mit einem simplen Echo-Server ausprobiert und es funktioniert problemlos:
GrußCode csharp:1 2 3 4 5 6 7 8 9 10 11 12 13
public static void RunSnippet() { Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 50000); Verbindung.NachrichtEmpfangenEvent += (x) => { WL("server> {0}", x); }; try { string l; while ((l = RL()) != null) { Verbindung.NachrichtSenden(l); } } finally { Verbindung.Trennen(); } }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Für was steht dein WL und RL in deinem Code? Console.WriteLine und Console.ReadLine?
-
19.04.11 21:25 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Ja. Ich verwende den SnippetCompiler (http://www.sliver.com/dotnet/SnippetCompiler/), dieser definiert diese Hilfsmethoden bereits vor (wobei ich die RL etwas angepasst habe).
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Warum funktioniert die Klasse nicht wenn ich sie so verwende:
Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
public partial class Form1 : Form { public Form1() { InitializeComponent(); Verbindung.NachrichtEmpfangenEvent += AppendText; } private void AppendText(string nachricht) { textBox2.AppendText(nachricht); } private void button1_Click(object sender, EventArgs e) { try { if (Verbindung.Verbunden) { Verbindung.Trennen(); } else { Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 1993); } } catch { MessageBox.Show("Fehler bei Verbindung"); } } private void button2_Click(object sender, EventArgs e) { if (textBox1.TextLength != 0 && Verbindung.Verbunden) { Verbindung.NachrichtSenden(textBox1.Text); } } }
-
Hi
nur mal so ins Blaue vermutet, ohne den kompletten Code gelesen zu haben:
Du willst den Textboxinhalt aus einem anderen Thread ändern.
Das mag .NET nicht ganz.
Mit einer Suche nach "Invoke invokerequired" findet man viele Beispiele, wie man das löst.
Gruß
-
Mit Invoken funktionierts auch nicht

Code csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
public partial class Form1 : Form { public Form1() { InitializeComponent(); Verbindung.NachrichtEmpfangenEvent += AppendText; } private void AppendText(string nachricht) { InvokeIfRequired(textBox2, (MethodInvoker) (() => textBox2.AppendText(nachricht))); } private void button1_Click(object sender, EventArgs e) { try { if (Verbindung.Verbunden) { Verbindung.Trennen(); } else { Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 50000); } } catch { MessageBox.Show("Fehler bei Verbindung"); } } private void button2_Click(object sender, EventArgs e) { if (textBox1.TextLength != 0 && Verbindung.Verbunden) { Verbindung.NachrichtSenden(textBox1.Text); } } private void InvokeIfRequired(Control target, Delegate methodToInvoke) { /* Mit Hilfe von InvokeRequired wird geprüft ob der Aufruf direkt an die UI gehen kann oder * ob ein Invokeing hier von Nöten ist */ if (target.InvokeRequired) { // Das Control muss per Invoke geändert werden, weil der aufruf aus einem Backgroundthread kommt target.Invoke(methodToInvoke); } else { // Die Änderung an der UI kann direkt aufgerufen werden. methodToInvoke.DynamicInvoke(); } }
-
Hat sich erledigt, habe nach dem Senden vergessen den StreamWriter zu Flushen.
Ähnliche Themen
-
Streamreader und Excel Zeilen
Von Arijane im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 24.11.08, 14:53 -
Sporadisches Problem mit StreamReader
Von jokakilla im Forum .NET Web und KommunikationAntworten: 4Letzter Beitrag: 15.07.07, 22:00 -
TCP Client mit StreamReader beenden
Von JJB im Forum .NET Web und KommunikationAntworten: 4Letzter Beitrag: 11.07.07, 08:27 -
TCP Problem: Lauschen an StreamReader ?
Von JJB im Forum .NET ArchivAntworten: 0Letzter Beitrag: 15.06.04, 10:01 -
[Sockets]Streamreader problem
Von Badmaster im Forum PHPAntworten: 9Letzter Beitrag: 13.06.03, 19:54





Zitieren


Login





