ByteArray zu String - Problem mit der Länge !

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ThinkPad.

    ByteArray zu String - Problem mit der Länge !

    Nabend,

    ich habe ein kleines aber lästiges Problem und da ich mich erst seit kurzem mit Netzwerkprogrammierung beschäftige, komme ich deswegen derzeit auch nicht weiter.
    Und zwar versende ich einen String mithilfe der System.Net.Sockets.TcpClient() an einen Server der das ganze mithilfe der TcpListener Klasse entgegen nimmt.
    Der Code sieht wie folgt aus:

    Client:

    VB.NET-Quellcode

    1. Dim tcpClient As New System.Net.Sockets.TcpClient()
    2. tcpClient.Connect(server, 8000)
    3. Dim networkStream As NetworkStream = tcpClient.GetStream()
    4. ' Sende Logindaten
    5. Dim password_md5 = MD5StringZuHash(password)
    6. Dim sendstring As String = "createaccount;" & username & ";" & password_md5 & ";" & email
    7. ' DEBUG
    8. MsgBox(sendstring.Length())
    9. Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(sendstring)
    10. networkStream.Write(sendBytes, 0, sendBytes.Length)


    Server:

    VB.NET-Quellcode

    1. ' Listener initialiseren
    2. Const portNumber As Integer = 8000
    3. Dim tcpListener As New TcpListener(portNumber)
    4. ' Listener starten
    5. tcpListener.Start()
    6. Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
    7. If tcpClient.Connected = True Then
    8. Dim networkStream As NetworkStream = tcpClient.GetStream()
    9. Do Until tcpClient.Connected = False
    10. ' Buffer für empfangende Daten
    11. Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    12. Dim clientdata As String
    13. ' Variablen für verarbeitete Client-Daten
    14. Dim clientdata_arr() As String
    15. Dim clientdata_header As String
    16. Dim responseString As String
    17. ' Daten aus Byte Array lesen
    18. networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
    19. clientdata = Encoding.ASCII.GetString(bytes)
    20. ....
    21. ....
    22. ....


    Das Problem ist jetzt das ein String vom Client laut sendstring.Length() z.b 60 Zeichen besitzt, auf dem Server hat die Variable clientdata in der jetzt dieser String genau so groß sein sollte aber eine Länge von 8193.

    Bin ziemlich ratlos :wacko:

    Bitte um Hilfe :thumbup:
    Die RecieveBufferSize ist genau 8192.
    In dem String sind auch alle Daten vorhanden die ich verschicken wollte, nur sind daran noch lauter anderer Zeichen dran gehaengt, bis 8192.
    Hab das ganze mal als TXT gespeichert und mir die Datei mit dem TotalCommander in Hexadezimal anzeigen lassen. Es werden einfach mehrere Hexadezimal 00 dran gehaengt.
    Jo, der Buffer wird mit 0en aufgefüllt. Ich dachte eigentlich, dass der ASCII-Encoder den String abschneidet...
    Kannst du das mal versuchen den UTF-8-Encoder zu verwenden? Den hab ich damals bei ner UDP-Übertragung verwendet.
    Hm.. hab den Code leider nicht hier...

    Was sagt denn beim Client sendBytes.Length ?

    Gibt es irgendwo ein möglichkeit die Länge der übertragenen Bytes abzufragen? Dann kannst du den String einfach abschneiden (Substring).
    Nabend,

    konnte das Problem nun endlich lösen...
    Hab nochmal die gesamte MSDN Library durchstöbert und bin auf diesen Code gestoßen:
    msdn.microsoft.com/de-de/libra…ener.accepttcpclient.aspx

    Dort werden nicht einfach per clientdata = System.Text.Encoding.ASCII.GetString(bytes) die bytes in einen String umgewandelt (der ganze mit den ganzen Hexadezimalen 0en) sondern so:

    VB.NET-Quellcode

    1. ' Daten aus Byte Array lesen
    2. Dim i As Int32
    3. i = networkStream.Read(bytes, 0, bytes.Length()) ' i beinhaltet die Anzahl der gesendeten Zeichen
    4. clientdata = System.Text.Encoding.ASCII.GetString(bytes, 0, i) ' Nur bis zu den gesendeten Zeichen auslesen


    Die zwei fehlenden Zeilen haben mir einige Nerven geraubt, aber nun funktioniert es endlich.

    Und danke Mad Andy für deine Hilfe :thumbup: