Visual Basic TCP Senden und Empfangen über gleichen Port

  • VB.NET
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Win8Error.

    Visual Basic TCP Senden und Empfangen über gleichen Port

    Hallo VB-Paradise Community,

    eine Aufgabe bringt micht nach mehreren Tagen an den Rand des Wahnsinns und der Verzweifelung. (War schon mehrfach geneigt meine Kiste aus dem Fenster zu schmeißen)
    Und zwar geht es um eine simple Aufgabe nähmlich es gibt einen Server wo am ende die Dateien die von den Clienten geschickt werden drauf landen. Das hab ich auch geschafft und geht alles Wunderbar. Aber eine Sache geht nicht oder ich finde nicht heraus wie es geht nähmlich das Herunterladen von dem Server auf dem Clienten. Es ist UNBEDINGT wichtig das bei beiden Aufgaben NUR der Server den Port freischalten muss und der Client nicht.

    Ich habe mich an Code auch schon aus diesem Forum bedient.

    Server:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Net.Sockets
    4. Imports System.Threading
    5. Module Module1
    6. Private Port As Integer = 65534
    7. Dim server As TcpListener
    8. Dim client As TcpClient
    9. Dim ipendpoint As IPEndPoint
    10. Dim list As New List(Of userlist)
    11. Dim t_empfaenger As Thread
    12. Private Structure userlist
    13. Dim stream_w As StreamWriter
    14. Dim stream_r As StreamReader
    15. Dim filename As String
    16. End Structure
    17. Sub Main()
    18. Console.Title = "File Send Server"
    19. ipendpoint = New System.Net.IPEndPoint(System.Net.IPAddress.Any, Port)
    20. server = New TcpListener(ipendpoint)
    21. server.Start()
    22. Console.WriteLine("Server is online on " + ipendpoint.ToString)
    23. While True
    24. client = server.AcceptTcpClient
    25. If client.Connected = True Then
    26. Dim c As New userlist
    27. c.stream_w = New StreamWriter(client.GetStream)
    28. c.stream_r = New StreamReader(client.GetStream)
    29. list.Add(c)
    30. Console.WriteLine("Client has connected")
    31. t_empfaenger = New Thread(AddressOf empfaenger)
    32. t_empfaenger.Start(c)
    33. End If
    34. End While
    35. End Sub
    36. Private Sub empfaenger(ByVal con As userlist)
    37. While True
    38. Try
    39. Dim post As String = con.stream_r.ReadLine
    40. If InStr(post, "client.info.") <> 0 Then
    41. post = Mid(post, 13)
    42. Dim info() As String = Split(post, ";")
    43. con.filename = info(0)
    44. Console.WriteLine("File Info:")
    45. Console.WriteLine(" Name: " + con.filename)
    46. Console.WriteLine(" Groesse: " + info(1) + "B")
    47. Console.WriteLine(" Type: " + info(2))
    48. End If
    49. If InStr(post, "client.file.") <> 0 Then
    50. post = Mid(post, 13)
    51. Console.WriteLine("Erhalte Byts")
    52. Dim buffer() As Byte = Convert.FromBase64String(post)
    53. File.WriteAllBytes(My.Application.Info.DirectoryPath + "\" + con.filename, buffer)
    54. Console.WriteLine("Sende Fertig")
    55. End If
    56. Catch ex As Exception : End Try
    57. End While
    58. End Sub
    59. End Module


    Client:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Net.Sockets
    4. Public Class Form1
    5. Dim client As TcpClient
    6. Dim stream_w As StreamWriter
    7. Dim stream_r As StreamReader
    8. Private Delegate Sub dAddText(ByVal text As String)
    9. Private Sub AddText(ByVal text As String)
    10. Me.Invoke(New dAddText(AddressOf ListBox1_additem), text)
    11. End Sub
    12. Private Sub ListBox1_additem(ByVal text As String)
    13. ListBox1.Items.Add(text)
    14. End Sub
    15. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, TextBox1.Click
    16. If OpenFileDialog1.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    17. TextBox1.Text = OpenFileDialog1.FileName
    18. End If
    19. End Sub
    20. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    21. If File.Exists(TextBox1.Text) = True Then
    22. Dim finfo As New FileInfo(TextBox1.Text)
    23. Label3.Text = "Name: " + finfo.Name
    24. Label4.Text = "Größe: " + finfo.Length.ToString + " B"
    25. Label5.Text = "Type: " + finfo.Extension
    26. End If
    27. Try
    28. If File.Exists(TextBox1.Text) = True And client.Connected = True Then
    29. Button3.Enabled = True
    30. End If
    31. Catch ex As Exception
    32. End Try
    33. End Sub
    34. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    35. client = New TcpClient
    36. TextBox2.Enabled = False
    37. TextBox3.Enabled = False
    38. TextBox2.Enabled = False
    39. Try
    40. client.Connect(TextBox2.Text, CInt(TextBox3.Text))
    41. Catch ex As Exception
    42. ListBox1.Items.Add("Fehler beim verbinden")
    43. TextBox2.Enabled = True
    44. TextBox3.Enabled = True
    45. TextBox2.Enabled = True
    46. Exit Sub
    47. End Try
    48. If client.Connected = True Then
    49. ListBox1.Items.Add("Verbindung hergestält")
    50. stream_w = New StreamWriter(client.GetStream)
    51. stream_r = New StreamReader(client.GetStream)
    52. If File.Exists(TextBox1.Text) = True Then
    53. Button3.Enabled = True
    54. End If
    55. Else
    56. TextBox2.Enabled = True
    57. TextBox3.Enabled = True
    58. TextBox2.Enabled = True
    59. ListBox1.Items.Add("Fehler beim verbinden")
    60. End If
    61. End Sub
    62. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    63. If File.Exists(TextBox1.Text) = True And client.Connected = True Then
    64. Button1.Enabled = False
    65. Button3.Enabled = False
    66. ListBox1.Items.Add("Sende Fileinfos")
    67. Dim finfo As New FileInfo(TextBox1.Text)
    68. stream_w.WriteLine("client.info." + finfo.Name + ";" + finfo.Length.ToString + ";" + finfo.Extension)
    69. stream_w.Flush()
    70. ListBox1.Items.Add("Sende File")
    71. Dim buffer() As Byte = File.ReadAllBytes(TextBox1.Text)
    72. stream_w.WriteLine("client.file." + Convert.ToBase64String(buffer))
    73. stream_w.Flush()
    74. ListBox1.Items.Add("Sende Fertig")
    75. Button1.Enabled = True
    76. Button3.Enabled = True
    77. End If
    78. End Sub
    79. End Class


    Wie bekomme ich nun den Clienten dazu die Dateien vom Server wieder herunterzuladen ohne das der Client Server Spielen muss und eine Portweiterleitung im Client notwendig wird.

    Bitte Bitte nur Sinnvolle Antworten und Nein ich habe die Suchfunktion nicht benutzt da mein lieber Computer bzw. mein lieber Firefox meint sich sonst aufzuhängen :whistling:

    Beispiele sind bei mir sehr Willkommen. Vielen Dank im vorraus.

    Gruß Joel
    Moin.

    Vorab: Ich habe den Code nur überflogen. So wie es aussieht ist Option Strict On eingestellt. Stimmt das? Dann fiel mir z. B. CInt(TextBox3.Text) auf. Man konvertiert keinen Text in eine Zahl, sondern man parst ihn. Das geht mit Interger.Parse bzw. Integer.TryParse. Weiterhin ist mir aufgefallen, dass du die Daten als Base64 überträgst. Warum? Übertrage sie doch als rohe Bytes.

    Zum Thema: Das ist eine ganz einfache Aufgabe. Übertrage noch die Aktion (Senden bzw. Empfangen) mit und führe dann die entsprechenden Maßnahmen durch. Da für gleiche Aktionen dann auf Client- und Serverseite so ziemlich das gleiche erledigt wird, wäre es sinnvoll den Kommunikationscode in eine Klassenbibliothek zu verschieben, deren Methoden dann nur noch den TcpClient, einige Metadaten (Dateiname, ...) und die Daten selbst (evtl. Stream und Bytearray als Überladungen) entgegennehmen und die Transfers ausführen.

    PS: Ich weiß nicht, wie dein Wissensstand aussieht. Wenn ich dich nun mit unbekannten Begriffen zugeballert habe, frag einfach ;)
    Mit freundlichen Grüßen,
    Thunderbolt
    Hi timmi31061,

    joa was TCP bzw. die System.Net Library angeht bin ich noch ein ziemlicher Neuling. Jedenfalls ging mit dem Code alles also das Senden zum Server wie schon gesagt muss ich die Inhalte auch herunterladen können.

    z.B. so wie bei FTP (Natürlich nicht den gleichen Code nur als Beispiel ;)

    VB.NET-Quellcode

    1. Dim wc as new System.Net.WebClient
    2. wc.Credentials = New System.Net.NetworkCredentials("benutzername,"passwort")
    3. wc.DownloadFile("ftp://12345.de/meinedatei.exe","C:\meinedatei.exe")


    EDIT: Und um Befehle übertragen zu können müsste ich doch einen Seperaten Server machen also ein Seperates Modul im Projekt und dort dann nur einen puren Chat Server machen ?

    Grüße Joel