VisualBasic Text auf mysteriöse Weise leer

  • Ersteller Ersteller Housechen
  • Erstellt am Erstellt am
H

Housechen

Gast
Ich hoffe mal, dass VS mir hier ´nen Scherz aufbinden will...

Code:
    Private Sub Receive()
        Do
            Dim ByteBuffer(Client.ReceiveBufferSize()) As Byte
            Client.GetStream.Read(ByteBuffer, 0, Client.ReceiveBufferSize())
            StringBuffer = Encoding.ASCII.GetString(ByteBuffer)
            Do While StringBuffer.Contains("EnDMessaGe")
                NachrichtenBuffer += StringBuffer.Substring(0, StringBuffer.IndexOf("EnDMessaGe"))
                MsgBox(StringBuffer.Substring(0, StringBuffer.IndexOf("EnDMessaGe")))
                StringBuffer = StringBuffer.Remove(0, StringBuffer.IndexOf("EnDMessaGe") + 10)
                Formverweis.Invoke(Received, New String(NachrichtenBuffer))
                NachrichtenBuffer = ""
            Loop
            NachrichtenBuffer += StringBuffer
        Loop
    End Sub

Ich werde mich wahrscheinlich eh gleich ärgern über die
einfache Antwort, aber hier erstmal das Problem:

Ich lese den Stream meines TCP-Clienten (Receive läuft in einem eigenen Thread). Um durch zu kleinen Buffer gesplittete Nachrichten oder zusammen versendete Pakete zu entflechten bzw. ordentlich zu ordnen, wende ich obigen Algorithmus an. Beim Invoke wird die fertiggepaarste Nachricht weitergegeben. Die MsgBox liefert mir immer die korrekte Nachricht. Tausche ich das "+=" beim Substring durch ein "=", funktioniert es, ebenso wenn ich unter dem ersten Loop die Zeile weglasse. Also NachrichtenBuffer bleibt trotz nicht leerem Substring leer. Beim allerersten Aufruf bzw. Nachrichtenempfang funktioniert auch alles korrekt. oO

Ich hab´ mir jetzt fast 2 Stunden lang die Nerven daran gequält, ich hoffe ihr könnt endlich diesen Mythos aufdecken. Normalerweise bin ich ja auch pro Selbstständigkeit und bin zu stur mir helfen zu lassen, aber das hier geht echt nicht gerade. -.-


Vielen vielen Dank im Voraus und bei Fragen fragt natürlich!

Mfg
Cyba_Mephisto
 
Zuletzt bearbeitet: (Komische Zeilenquetschungen entfernt. oO)
In derselben Klasse am Anfang.

Code:
    Private NachrichtenBuffer As String
 
Da ich nicht mit VB arbeite, weiß ich nicht ob Strings nach dem Deklarieren korrekt initialisiert werden, aber deiner Fehlerbeschreibung nach zu urteilen werden sie dies nicht. Daher würde ich dir vorschlagen das selbst zu tun, denn anscheinend schlägt die += Zuweisung fehl.
 
Werden sie, ich habe in VB.net schon genug Programme geschrieben und so hat es bis jetzt immer funktioniert. Ich deklariere Variablen, wie man es immer tut. Korrekt und an der richtigen Stelle.
Außerdem gibt es ja keine Fehlermeldung von VS, das verwundert mich ja.
 
Cyba_Mephisto schrieb:
Falsch.
deklarieren != initialisieren
Laufzeitfehler != Syntaxfehler
--> Nullverweisausnahme

Den entscheidenden Hinweis habe ich dir bereits in meiner ersten Antwort gegeben.
 
Variablen müssen in VB nicht initialisiert werden.
http://de.wikibooks.org/wiki/Visual_Basic_.NET:_Variablen
Siehe hier unter Datentypen.
Ihnen werden direkt Standardwerte zugeordnet um NullVerweise zu stoppen. Bei Klassen und Structs ist man aber dazu gezwungen. Also hier macht man es praktisch in einem Wisch in der Deklaration.
Laufzeitfehler werden mit über den In-Time Debugger sofort angezeigt, Syntaxfehler nach dem Eingeben rot markiert, das Compilieren wird verhindert. Nullverweise oder nicht verwendete Objekte/Variablen werden mir grün geschlängelt und ich kriege eine Warnung.

Nichts von alledem ist vorhanden.

Bemerkenswert finde ich ja jedoch, dass es beim ersten Mal ja klappt. Ich denke unten unter dem ersten Loop ist irgendwas faul bzw. dort fängt es erst an und verbreitet sich beim nächsten Aufruf nach oben.


So Lösung an alle:

Trotz aller Anzeichen (mit dem "+=") muss der Stream byteweise eingelesen werden! So funktioniert es zumindest bei mir.
 
Zuletzt bearbeitet:
Zurück
Oben