Hallo Leute, ich bin neu hier und hoffe dass ich mit meinem Anliegen hier richtig bin.
Ich habe einen kleinen TCP Client geschrieben. Dieser holt die Daten über die ReadLine-Methode des Streamreaders ab. Hier der codeschnipsel:
private void ReceiveMessages()
{
srReceiver = new StreamReader(tcpServer.GetStream());
while (Connected)
{
try
{
this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { srReceiver.ReadLine() });
}catch(IOException io)
{
MessageBox.Show(io.ToString());
}
}
}
private void UpdateLog(string strMessage)
{
switch (strMessage)
{
case "ean": txtLog.Text += "Scan ean code\r\n"; break;
case "0": txtLog.Text += "Nothing to do\r\n"; break;
}
}
Das Ganze funktioniert auch so wie es sollte, jedoch nur wenn der Streamreader am Ende ein "\r\n" vorfindet. Mein Stringtermininierungszeichen ist allerdings ein "\r". Das Terminierungszeichen seitens des Servers kann ich nicht ändern.
Bei dem Streamwriter gibt es ja die NewLine-Eigenschaft, diese scheint es beim dem Reader leider nicth zu geben.
Hat eventuell jemand eine ganz simple Lösung für mein Problem ?
Hatte schonmal gegoogelt. Viele meinten man solle einfach dei ReadToEnd-Methode nehmen und dann den String quasi manuell untersuchen. Die ReadToEnd-Methode liefert bei mir allerdings garnichts. Erst wenn ich den Socket schließe liefert die Methode das was ich gesendet habe ?!
Gut, hoffe ihr könnt mir helfen.
Danke schonmal im Voraus.
Hallo,
dann wird dir wahrscheinlich nichts anderes übrig bleiben, als die Zeilen komplett selbst einzulesen, d.h. Byte für Byte lesen, bis das von dir erwartete Zeichen kommt.
Nobody is perfect. I'm sad, i'm not nobody 🙁
A line is defined as a sequence of characters followed by a line feed ("\n"), a carriage return ("\r"), or a carriage return immediately followed by a line feed ("\r\n"). The string that is returned does not contain the terminating carriage return or line feed. The returned value is Nothing if the end of the input stream is reached.
Das Zitat stammt aus der Doku vom StreamReader - ergo liegt der Fehler vielleicht woanders, als beim ReadLine.
Die Zeilen hatte ich auch schon entdeckt. Deswegen wundert es mich umso mehr dass es nicht auf Anhieb funktioniert. Immerhin sollte es das laut Doku.
Hallo Rush,
hab das Beispiel der Doku etwas umgeschrieben, um zu testen ob es sicher funktioniert, und das tut es:
[Test]
public static void Main()
{
string path = Path.GetTempFileName();
try
{
using (StreamWriter sw = new StreamWriter(path))
{
sw.Write("This\r");
sw.Write("is some text\n");
sw.Write("to test\r\n");
}
using (StreamReader sr = new StreamReader(path))
{
int i = 0;
while (sr.Peek() >= 0)
{
Console.WriteLine("Line {0} : {1}",++i, sr.ReadLine());
}
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
File.Delete(path);
}
Gruß,
Michael