Daten empfangen via TCP/IP

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von henny.

    Daten empfangen via TCP/IP

    Hallo,

    ich habe folgendes Problem.
    Ich habe einen Code, mit dem ich auf einem Port abhöre, ob Daten vorhanden sind.
    Falls ja, möchte ich diese empfangen. Das klappt auch super.
    Jetzt möchte ich, dass wenn ich von einem anderem PC Daten an diese IP-Adresse und dem Port schicke, diese auch empfangen.
    Das funktioniert nicht.

    Ich habe folgenden Code auf dem Server:

    Quellcode

    1. Imports MSCommLib
    2. Imports System.IO
    3. Imports System.IO.Path
    4. Imports System.Net.Sockets
    5. Imports System.Net
    6. Public Class Form1
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. txt_Text.Text = ""
    9. Timer1.Start()
    10. End Sub
    11. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    12. 'Zuhörer startet
    13. Listener.Start()
    14. If Listener.Pending = True And Host.Connected = False Then
    15. Host = Listener.AcceptTcpClient()
    16. Networkstream1 = Host.GetStream
    17. End If
    18. If Host.Client.Available > 0 Then
    19. txt_Text.Text = ""
    20. Dim Buffer(Host.Client.Available) As Byte
    21. Networkstream1.Read(Buffer, 0, Host.Client.Available)
    22. For Each item As Byte In Buffer
    23. txt_Text.Text &= Microsoft.VisualBasic.Chr(item)
    24. Next
    25. End If
    26. End Sub
    27. End Class


    Hier das Modul:

    Quellcode

    1. Public Listener As New System.Net.Sockets.TcpListener(12345)
    2. Public Host As New System.Net.Sockets.TcpClient()
    3. Public Networkstream1 As System.Net.Sockets.NetworkStream



    Auf dem Client PC habe ich folgenden Code:

    Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Text
    3. Imports System.IO
    4. Public Class Form1
    5. Dim stream As NetworkStream
    6. Dim streamw As StreamWriter
    7. Dim streamr As StreamReader
    8. Dim Client As New TcpClient
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. Timer1.Start()
    11. End Sub
    12. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    13. Dim Port As Integer = 12345
    14. Client.Connect(192.164.563.22, Port)
    15. Try
    16. If Client.Connected Then
    17. Stream = Client.GetStream ' Stream wird auf Client verwiesen
    18. streamw = New StreamWriter(Stream) ' Stream zum Senden
    19. streamr = New StreamReader(Stream) ' Stream zum Empfangen
    20. login()
    21. Else
    22. MsgBox("Verbidnung mit 192.164.563.22 konnte nicht" & _
    23. "aufgebaut werden!")
    24. End If
    25. Catch
    26. MsgBox("Client ist nicht verbunden")
    27. End Try
    28. End Sub
    29. Sub client_send(ByVal text As String)
    30. streamw.WriteLine(Text)
    31. streamw.Flush()
    32. End Sub
    33. Function client_recieve() As String
    34. client_recieve = streamr.ReadLine
    35. End Function
    36. ' Nach erfolgreicher Verbindung:
    37. Sub login()
    38. Try
    39. 'Senden/Empfangen:
    40. client_send("online")
    41. client_recieve()
    42. If client_recieve() = "ok" Then
    43. MsgBox("Übertragung funktioniert")
    44. Client.Close()
    45. Else
    46. MsgBox("Fehler bei der Übertragung")
    47. Exit Sub
    48. Client.Close()
    49. End If
    50. Catch
    51. MsgBox("fehler beim SubAufruf")
    52. Client.Close()
    53. End Try
    54. End Sub
    55. End Class


    Kann mir bitte bitte jemand weiterhelfen???


    Danke schon mal im Vorraus!
    Ich habe schon viel mit Dateien senden über TCP/IP herum probiert und habs auch geschafft.
    Ich hab heut nicht viel Zeit. Muss des Geburtstag von meine Bruder feiern :D.
    Also schrieb ich dir schnell ein Beispiel.

    Client:

    VB.NET-Quellcode

    1. Private Sub SendFile(ByVal pfad As String)
    2. Dim Buffer() As Byte = File.ReadAllBytes(pfad) 'List alle Byts das Datei aus
    3. Dim sbuffer As String = Convert.ToBase64String(Buffer) 'Wandelt das Byte-Array in einen String um
    4. streamw.WriteLine("client.send." + sbuffer) 'Das "client.send." ist mein erfundenes Protokoll das der Server weis was er damit machen soll
    5. streamw.Flush() 'Dürfte klar sein
    6. End Sub


    Bei Srever hab ich auch einen StreamWriter und StreamReader statt dem Networkstream benutzt also so wie beim Client und wenn du schon einen Timer benutzen wielst schau ob er beim Interval auf 1 ist.

    Server: (Gehört in die If Host.Client.Available > 0 abfrage)

    VB.NET-Quellcode

    1. If InStr(post, "client.send.") = 1 Then
    2. post = Mid(post, 13) 'Nimmt das "client.send." weg das wir nur die Byts haben
    3. Dim Buffer() As Byte = Convert.FromBase64String(post) 'Wandelt den String wieder zu Byte-Array um
    4. File.WriteAllBytes("Speicherort", Buffer) 'Schreibt die neue Datei
    5. End If


    Ich hoff es funkt.

    Edit: Hab noch was gefunden. Schau mal im Anhang :D!

    Gruss
    almdandi
    Dateien

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

    also er hat schon ein Programm und ich will nicht, dass er jetzt einfach etwas kopiert(was evtl. das gleiche Problem hat wie seins...)
    außerdem würde ich die Bytes direkt übertragen und nicht als Base64 String, das ist nämlich langsam ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Erstmal hat das nichts mit dem Router, sondern in erster Linie damit zu tun, was du von deinem Provider zur Verfügung gestellt bekommst, und zweitens ist ein ständiges kodieren und dekodieren von und in Base64 tatsächlich eher suboptimal...
    genau ist es auch nicht, wenn man die Bytes von einer Datei überträgt, dann kann man diese mit dem NetworkStream direkt in einen Buffer lesen und speichern...TCPClient/TCPListener sind auch nicht nötig, wofür gibt es Sockets ?!...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---