Simples, funktionierendes Beispiel einer TCP/IP-Verbindung zwischen zwei Rechnern.

    • VB.NET

    Es gibt 53 Antworten in diesem Thema. Der letzte Beitrag () ist von xeno.

      Hallo RodFromGermany
      Danke für deine Hilfe !
      Ich habe das Problem gefunden. Beim Server steht unter Botton1 client.Close(), das muss heißen client.Client.Close. Besser wäre im Deklarationsteil client as TCPClient als myClient as TCPClient zu definieren, dann könnte man mit Botton1 myClient.Client.Close auch den Client schließen.

      Das zweite Problem ist im Client die Definition von t as Thread. Wird der Server gestoppt und wieder gestartet, dann wird zwarim Client ein neuer Client angelegt, aber kein neuer Thread gestartet
      Anstatt t as New Threading.Thread(AddresOf Main)
      müsste heißen im Definitionsteil t as New Threading.Thread.
      Im Button1 unter Start
      t = New Threading.Thread(AddressOf Listen)
      t.Start()

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael_57“ ()

      Willkommen im Forum. :thumbup:

      Robin_32 schrieb:

      "kryptische Zeichen"
      Du musst beim Eröffnen des Streams diesem je dasselbe Encoding zuweisen.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Guten Morgen und Danke!

      koenntest du mir ein Beispiel machen?

      meine Verbindung sieht so aus:

      VB.NET-Quellcode

      1. 'declarations
      2. Private stream As NetworkStream
      3. Private streamw As StreamWriter
      4. Private streamr As StreamReader
      5. Private client As New System.Net.Sockets.TcpClient()
      6. Dim t As New Threading.Thread(AddressOf Listen)
      7. Private Delegate Sub DAddItem(ByVal s As String)
      8. 'listener
      9. Private Sub Listen()
      10. Try
      11. While client.Connected
      12. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
      13. End While
      14. Catch ex As IOException
      15. End Try
      16. End Sub
      17. 'connection
      18. Private Sub connection()
      19. client = New TcpClient
      20. client.Connect("beispielchat.de", 1234)
      21. If client.Connected Then
      22. stream = client.GetStream
      23. streamw = New StreamWriter(stream)
      24. streamr = New StreamReader(stream)
      25. streamw.WriteLine("Handshake1" & vbCrLf)
      26. streamw.WriteLine("Handshake2" & vbCrLf)
      27. streamw.WriteLine("Handshake3" & tb_Nick.Text & vbCrLf)
      28. streamw.WriteLine("Handshake4" & tb_Pw.Text & vbCrLf)
      29. streamw.Flush()
      30. tb_Nick.ReadOnly = True
      31. tb_Pw.ReadOnly = True
      32. btn_Login.Visible = False
      33. btn_Logout.Visible = True
      34. tb_Channel.Focus()
      35. t.Start()
      36. End If
      37. End Sub
      38. 'listener receive
      39. Private Sub AddItem(ByVal s As String)
      40. Dim receive As String = s
      41. 'add to Console
      42. tb_Console.Text = tb_Console.Text & vbNewLine & s
      43. Catch ex As Exception
      44. End Try
      45. End Sub


      fuer regex/split danach braucht man ja kein encoding oder?
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      wenn ich dem StreamReader "Encoding.Default" zuweise werden zwar die "Server Nachrichten" richtig dargestellt aber dafuer nicht die "Chat Nachrichten" die sehen dann so aus

      Name: Įderung (Änderung)
      Name: ä
      Name: ö
      Name: ü

      auch wenn ich dem StreamWriter das selbe anhaenge.. mit Regex hat das aber zufaellig nichts zu tun? Ich muss naemlich die Nachrichten die ich vom Server zugeschickt bekomme mit regex
      bearbeiten und sie dann an die RichTextBox senden

      VB.NET-Quellcode

      1. 'listener receive
      2. Private Sub AddItem(ByVal s As String)
      3. Dim receive As String = s
      4. 'add to Console
      5. tb_Console.Text = tb_Console.Text & vbNewLine & s
      6. 'Regex Chat Messages
      7. Dim message_receive As String = "^g(?<WriteChannel>[^#]+)#(?<WriteUser>[^#]+)#(?<WriteChannelRights>[^#]+)#(?<WriteType>[^#]+)#(?<WriteMessage>.*)"
      8. Dim message_match As Match = Regex.Match(receive, message_receive)
      9. Dim WriteChannel As String = message_match.Groups(1).Value
      10. Dim WriteUser As String = message_match.Groups(2).Value
      11. Dim WriteChannelRights As String = message_match.Groups(3).Value
      12. Dim WriteType As String = message_match.Groups(4).Value
      13. Dim WriteMessage As String = message_match.Groups(5).Value
      14. Try
      15. Select Case s
      16. 'Chat Nachrichten
      17. Case "g" & WriteChannel & "#" & WriteUser & "#" & WriteChannelRights & "#" & WriteType & "#" & WriteMessage
      18. rtBox.Text = rtBox.Text & vbNewLine & (Now.ToString("[HH:mm:ss] ") & WriteUser & ": " & WriteMessage)
      19. Catch ex As Exception
      20. End Try
      21. End Sub

      @Robin_32 Server und Client müssen natürlich dasselbe Encoding verwenden.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      @Robin_32 Dann musst Du mal probieren, was der für ein Encoding haben könnte, generiere dazu Daten mit Umlauten und solch.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      ich habe ja schon gefunden welches Encoding er braucht

      VB.NET-Quellcode

      1. Encoding.Default


      nur das Problem ist wenn ich dem StreamReader "Encoding.Default" zuweise werden zwar die Umlaute auf der Benutzer-/Raeume Liste richtig dargestellt aber dafuer nicht mehr im Channel in den Chat Nachrichten:



      und wenn ich Encoding aus dem StreamReader entferne ist es andersherum dann stimmen die Chat Nachrichten bzw. die Umlaute aber dafuer nicht mehr in der Benutzer-/Raeume Liste



      das Problem macht mich langsam verrueckt ich komm einfach auf keine Loesung
      @Robin_32 Kannst Du den Channels verschiedene Encodings geben?
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Channellist / Userlist habe ich auch schon einzeln versucht zu entcoden hier ein Beispiel zur Userlist:

      VB.NET-Quellcode

      1. 'Userlist split
      2. Select Case s.StartsWith("j")
      3. Case True
      4. Dim Text As String
      5. Dim StartZ As String
      6. Dim EndZ As String
      7. Dim Pos1 As Long
      8. Dim Pos2 As Long
      9. Dim Result As String
      10. Text = s '(jRaum#bl�mchen:3::f::#User1*:3::::#User2:3::::#User3:27::::#)
      11. StartZ = "#"
      12. EndZ = ":"
      13. Pos1 = InStr(1, Text, StartZ) + Len(StartZ)
      14. Pos2 = InStr(1, Text, EndZ)
      15. Result = Mid(Text, Pos1, Pos2 - Pos1)
      16. Dim data() As Byte = Encoding.UTF8.GetBytes(Result)
      17. Dim receiver As String = Encoding.Default.GetString(data)
      18. MsgBox(receiver)
      19. Case False
      20. End Select


      Das Ergebnis war:

      "bl�mchen"

      ich hab schon alle moeglichen encodings durch es kommt immer entweder zu diesem Resultat oder die Umlaute werden zu "?"

      Verschiedene Computer können unterschiedliche Codierungen als Standard verwenden, und die Standard Codierung kann sich auf einem einzelnen Computer ändern. Wenn Sie die Codierung Default zum Codieren und Decodieren von Daten verwenden, die zwischen Computern gestreamt werden, oder die zu unterschiedlichen Zeitpunkten auf demselben Computer abgerufen werden, werden diese Daten möglicherweise falsch übersetzt. Außerdem verwendet die von der Default -Eigenschaft zurückgegebene Codierung den Fall Back mit dem besten Zeichen Wert, um von der Codepage unterstützte Zeichen nicht unterstützte Zeichen zuzuordnen. Aus diesen Gründen wird die Verwendung der Standard Codierung nicht empfohlen. Um sicherzustellen, dass codierte Bytes ordnungsgemäß decodiert werden, sollten Sie eine Unicode- UTF8Encoding Codierung UnicodeEncodingverwenden, z. b. oder. Sie können auch ein Protokoll auf höherer Ebene verwenden, um sicherzustellen, dass das gleiche Format zum Codieren und decodieren verwendet wird.


      Quwelle: docs.microsoft.com/de-de/dotne…ult?view=netframework-4.8
      Das Problem besteht darin, dass die Datenfelder verschiedene Encodings benutzen. Am einfachsten tust du dich damit, den Stream zunächst mit einem 8 Bit Encoding zu decodieren (Beispielsweise Latin1) und dann auf UTF-8 zu wechseln, wenn das Serverkommando es vorsieht

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xeno“ ()