Empfangene Bytes eines TCP Clients auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von mcvb.

    Empfangene Bytes eines TCP Clients auslesen

    Hallo zusammen

    Bis jetzt konnte ich alle meine Probleme beheben, indem ich auf diesem Forum gestöbert habe. Nun habe ich ein Problem, welches ich nicht gefunden habe. In meinem Projekt geht es darum, dass sich mehrere TcpClients bei meinem Programm (auf welchem ein Server läuft) anmelden. Das funktioniert soweit sehr gut und ich kann auch die IP der jeweiligen Clients auslesen. Wenn sich der Client anmeldet, sendet er auch noch Daten mit, welche ich nun gerne auslesen würde. Ich habe ein Screenshot gemacht um aufzuzeigen welches ByteBuffer ich auslesen will. Leider weiss ich nicht wie ich auf dieses Buffer zugreifen kann...

    Ich bitte Euch nun um Tipps und Tricks.

    Vielen Dank schon Mal

    Freundliche Grüsse
    Marc
    Bilder
    • vbQuestion.png

      28,87 kB, 564×750, 203 mal angesehen
    Da das ByteArray ein "stinknormales" Array ist, kannst du damit alles machen, was du auch mit einem Array mache kannst.
    z.b. Wert = Bytearray(5) ' holt sich das Ding aus der 6. Stelle

    Falls du alles in einen String umwandeln willst, könnte dies helfen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim myText As String
    3. Dim Bytearray(3) As Byte
    4. Bytearray(0) = 65
    5. Bytearray(1) = 70
    6. Bytearray(2) = 70
    7. Bytearray(3) = 69
    8. myText = System.Text.Encoding.ASCII.GetString(Bytearray, 0, Bytearray.Length)
    9. MsgBox(myText & " :-)") ' Alter Scherz aus HEX-Zeiten
    10. End Sub

    Ich hatte mal für nen kleinen Chat so nen snippet gepostet. kannst dir angucken:

    VB.NET-Quellcode

    1. Private allConnections As New List(Of Connection)
    2. Protected Sub Accepted(iasy As IAsyncResult)
    3. Dim newClient = New Connection(listener.EndAcceptTcpClient(iasy).GetStream)
    4. 'Hier
    5. kannst du alles mit dem neuen Clienten machen da er eigtl noch nicht
    6. auf dem Server angezeigt wird und wenn dir was nicht passt schliesst du
    7. seine Verbindung
    8. Dim name As String = String.Empty
    9. newClient.GetName(name)
    10. Do While allConnections.Where(Function(item) item.Name = name).Any
    11. newClient.Write("Name bereits vorhanden, bitte nochmal.")
    12. newClient.GetName(name)
    13. Loop
    14. newClient.Name = name
    15. allConnections.Add(newClient) 'Hier wird er nun auf dem Server angezeigt und ist "offiziel" drauf.
    16. newClient.Stream.BeginRead(newClient.Input, 0, newClient.Input.Length, AddressOf Read, newClient)
    17. listener.BeginAcceptTcpClient(AddressOf Accepted, Nothing)
    18. End Sub
    19. Protected Sub Read(iasy As IAsyncResult)
    20. Dim newClient = DirectCast(iasy.AsyncState, Connection)
    21. Try
    22. Dim length As Integer = newClient.Stream.EndRead(iasy)
    23. Dim output As String = Encoding.Default.GetString(newClient.Input, 0, length)
    24. MessageBox.Show(String.Concat(newClient.Name, ": ", output))
    25. newClient.Stream.BeginRead(newClient.Input, 0, newClient.Input.Length, AddressOf Read, newClient)
    26. Catch
    27. allConnections.Remove(newClient)
    28. For Each user In allConnections
    29. user.Write(String.Concat(newClient.Name, "-", "disconnected")) 'muss dann dementsprechend von allen Clienten verarbeitet werden
    30. Next
    31. End Try
    32. End Sub
    33. End Class
    34. Public Class Connection
    35. Public Sub New(ByVal stream As NetworkStream)
    36. Me.Stream = stream
    37. End Sub
    38. Private _input(256) As Byte
    39. Public ReadOnly Property Input() As Byte()
    40. Get
    41. Return _input
    42. End Get
    43. End Property
    44. Public Property Stream As NetworkStream
    45. Public Property Name As String
    46. Public Sub Write(ByVal text As String)
    47. Dim input As Byte() = Encoding.Default.GetBytes(text)
    48. Me.Stream.BeginWrite(input, 0, input.Length, AddressOf Me.Stream.EndWrite, Nothing)
    49. End Sub
    50. Public Sub GetName(ByRef input As String)
    51. Dim length As Integer = Me.Stream.Read(Me.Input, 0, Me.Input.Length)
    52. input = Encoding.Default.GetString(Me.Input, 0, length)
    53. End Sub
    54. End Class
    he he.. habe mal in meinen alten Programmen gewühlt..
    Falls du die Ausgabe der Bytes in String haben willst, also "65707069"
    sollte dieses Helfen:
    Umwandeln ByteArray to Hex-String

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim myText As String
    3. Dim Bytearray(3) As Byte
    4. Bytearray(0) = 65
    5. Bytearray(1) = 70
    6. Bytearray(2) = 70
    7. Bytearray(3) = 69
    8. myText = ByteArrToHexString(Bytearray)
    9. MsgBox(myText)
    10. End Sub
    11. Function ByteArrToHexString(ByVal byteArr() As Byte) As String
    12. Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder()
    13. For i As Integer = 0 To byteArr.Length - 1
    14. sb.Append(byteArr(i).ToString("x2"))
    15. Next
    16. Return sb.ToString()
    17. End Function
    Hallo zusammen,

    Danke für die vielen ausführlichen Tipps. Ich habe nun gemerkt was ich falsch machte. Ich wollte Immer über den StreamReader auslesen. Dabei muss ich nur den Stream Read auslesen. Das ganze sieht jetzt so aus:

    VB.NET-Quellcode

    1. Dim c As New Connection
    2. Dim myReadBuffer(1024) As Byte
    3. c.stream = client.GetStream
    4. c.streamr = New StreamReader(c.stream)
    5. c.streamw = New StreamWriter(c.stream)
    6. _IP = client.Client.RemoteEndPoint.ToString.Split(":")(0)
    7. c.stream.Read(myReadBuffer, 0, myReadBuffer.Length)


    Die Bytes welche ich auswerten will, sind nun in myReadBuffer gespeichert.

    Freundliche Grüsse
    Marc