Benutzer mit den meisten Antworten
Networkstream wird in der WPF falsch angezeigt

Frage
-
Hallo,
Ich hab mein Programm(ein Chat-Client) in die WPF importiert, aber wenn dieses nun den Networkstream als String in einer Textbox anzeigt,
erscheinen nach dem Text 30 "Rechtecke". Ich selber kann mir das nicht erklären und habe auch keine Lösung gefunden.
hier der Code:
private void getMessage()
{
while (true)
{
try
{
serverStream = clientSocket.GetStream();
int buffSize = 0;
byte[] inStream = new byte[10025];
buffSize = clientSocket.ReceiveBufferSize;
serverStream.Read(inStream, 0, buffSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
readData = "" + returndata;
msg();
}
}
}
private void msg()
{
this.Dispatcher.Invoke(new Action<TextBox>(textBox => textBox.Text += Environment.NewLine + " >> " + readData),this.textBox1);
}LG
Tea Time
Ps: k.a. wieso, aber man kann die "Rechtecke" nicht kopieren
- Bearbeitet tea time Mittwoch, 18. Januar 2012 20:45
Antworten
-
Hallo Tea Time,
Wenn Du das nächste Mal Codeschnippsel postest, die Du nicht selber geschrieben hast, füge bitte auch die Quelle hinzu (z.B. http://csharp.net-informations.com/communications/csharp-chat-server.htm), damit die Teilnehmer in diesem Forum die Möglichkeit haben, den ganzen Context des Codes zu sehen. Die Quelle erklärt in diesem Fall mit einem Schlag sowohl das byte[10025], als auch das fehlende Read, das verwendete Encoding usw.
Gruß
Marcel- Als Antwort markiert tea time Montag, 23. Januar 2012 15:48
Alle Antworten
-
Ähhh Was ?
Also WPF = Windows Presentation Foundation , eine Technologie um Anwendungsoberflächen zu generieren in XAML.
Was genau machst du ? Bitte poste uns Code , damit wir nachvollziehen können was du machst und gib uns bitte eine detailiertere Fehlerbeschreibung.
Grüße
-
Hallo,
Deine Empfangsroutine hatte schon Fehler, wenn die unverändert übernommen wurde.
Wenn Du von einem Stream liest, so liefert Dir die Read-Methode die effektive Anzahl an gelesenen Bytes.
Und die müsstest Du der Encoding.GetString schon mitteilen, ansonsten konvertiert die auch 0-Bytes in Zeichen,
was je nach Schriftart hübsche Kästchen werden können.Das ist aber nicht das einzige Problem. Nur weil Du großzügig 10025 Bytes vorgeben hast,
heißt das nicht, dass über einen Netzwerk-Stream alle Bytes auf einmal übertragen werden.
Es ist durchaus möglich (und bei voller Nutzung wahrscheinlich, dass daraus mehrere Päckchen
gemacht werden und Du mehrmalig Read aufrufen musst, um alle Daten zu erhalten.
Thomas Scheidegger hat das illustiert in:
Socketverbindung wird unerwartet unterbrochenVorerst zum letzten:
Mit ASCII kannst Du nur wirklich nur Basis-Zeichen darstellen, schon deutsche Umlaute sind dort nicht mehr enthalten.
Deswegen empfiehlt es sich Encoding.UTF8 zu verwenden.
Dabei wiederum kann es passieren, dass ein Zeichen nicht in einem Paket übertragen wird,
da Zeichen dort mehr als ein Byte umfassen können, siehe UTF-8.
Und dort sollte deswegen ein Decoder verwendet werden, siehe GetDecoder-MethodeGruß Elmar
-
Hallo Tea Time,
Wenn Du das nächste Mal Codeschnippsel postest, die Du nicht selber geschrieben hast, füge bitte auch die Quelle hinzu (z.B. http://csharp.net-informations.com/communications/csharp-chat-server.htm), damit die Teilnehmer in diesem Forum die Möglichkeit haben, den ganzen Context des Codes zu sehen. Die Quelle erklärt in diesem Fall mit einem Schlag sowohl das byte[10025], als auch das fehlende Read, das verwendete Encoding usw.
Gruß
Marcel- Als Antwort markiert tea time Montag, 23. Januar 2012 15:48