Datei über TCP/IP Versenden!

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Datei über TCP/IP Versenden!

    Hallo!
    Ich habe eine Class die das alte Winsock von Vb6 ersetzt.
    Ich habe es hin bekommen das man Strings übers Netzwerk verschicken kann!
    Aber leider noch keine Dateien.
    Deshalb suche ich Hier nach Hilfe.
    Ich möchte dass man auch eine Datei verschicken kann!
    Mit dem Befehl SendenClient, kann ich einen String senden.
    Vielen Dank!

    Hier der Code:
    Dieser Code soll eine Datei übers Netzwerk übertragen....

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Winsock1.SendenClient(Me.TextBox2.Text)
    3. End Sub
    4. Public Sub SendenClient(stext As String)
    5. Try
    6. Dim sendbytes() As Byte = System.Text.Encoding.ASCII.GetBytes(stext)
    7. TCPClientz.Client.Send(sendbytes)
    8. Catch
    9. End Try
    10. End Sub


    Dieser Code soll die Datei empfangen, außerdem sollte er auch Strings empfangen...

    VB.NET-Quellcode

    1. Private Sub Winsock1_DateiEmpfangServer(dateiempfang As String) Handles Winsock1.DateiEmpfangServer
    2. Me.TextBox3.Text = dateiempfang
    3. ' Hier und jetzt!?
    4. End Sub

    Visual Basic.NET 8o
    MS-SQL
    8o
    @KaskadekingDE
    Danke für die schnelle Antwort!

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    2. ' Datei auslesen und versenden!
    3. Dim testbyte() As Byte = System.Text.Encoding.GetEncoding(1252).GetBytes("‪F:\Temp\Links.docx")
    4. Winsock1.SendenServer(Convert.ToBase64String(testbyte))
    5. End Sub


    VB.NET-Quellcode

    1. Private Sub Winsock1_DateiEmpfangClient(dateiempfang As String) Handles Winsock1.DateiEmpfangClient
    2. Me.TextBox3.Text = dateiempfang
    3. ' Datei empfangen und Speichern
    4. Dim buffer() As Byte = Convert.FromBase64String(dateiempfang)
    5. System.IO.File.WriteAllBytes(Application.StartupPath & "\Downloads\Links.docx", buffer)
    6. End Sub


    Leider, wird die Datei nicht richtig verschickt!
    Wie kann ich das Problem lösen?
    Cool, wäre es auch ein Fortschrittbalken zu sehen.
    (1-100%)
    Visual Basic.NET 8o
    MS-SQL
    8o
    Versuch's mal so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub SendFile(file As String)
    2. Dim bytes() As Byte = File.ReadAllBytes(file)
    3. Dim base As String = Convert.ToBase64String(bytes)
    4. Winsock1.SendenServer(base)
    5. End Sub
    6. Private Sub Winsock1_DateiEmpfangClient(dateiempfang As String) Handles Winsock1.DateiEmpfangClient
    7. ' ...
    8. Dim bytes() As Byte = Convert.FromBase64String(dateiempfang)
    9. System.IO.File.WriteAllBytes("pfad", bytes)
    10. End Sub
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Vielen Dank!

    VB.NET-Quellcode

    1. Dim bytes() As Byte = Convert.FromBase64String(dateiempfang)

    Leider kommt jetzt an dieser stelle eine Fehlemeldung(siehe Bild).
    :cursing:
    Bilder
    • y.png

      44,48 kB, 1.296×510, 180 mal angesehen
    • yy.png

      61,17 kB, 1.769×473, 165 mal angesehen
    Visual Basic.NET 8o
    MS-SQL
    8o
    Das ist komisch :huh: .
    Wann wird das Event denn ausgelöst? Wenn es empfangen wurde oder wenn es empfangen wird?
    Hab den Base64-String mal hier dekodiert und bei mir kommt dann ?F:\Temp\Links.docx raus.

    Ich teste das mal bei mir selber aus.

    EDIT: Funktioniert bei mir:

    Spoiler anzeigen

    C#

    C#-Quellcode

    1. private void button2_Click(object sender, EventArgs e)
    2. {
    3. var begin = File.ReadAllText("text.txt");
    4. var bytes = File.ReadAllBytes("text.txt");
    5. var result = Convert.ToBase64String(bytes);
    6. var bytesBack = Convert.FromBase64String(result);
    7. File.WriteAllBytes("text.txt", bytesBack);
    8. var result2 = File.ReadAllText("text.txt");
    9. var nl = Environment.NewLine;
    10. MessageBox.Show("Eingangs-Datei: text.txt" + nl + "Inhalt: " + begin + nl + "Base64: " + result + nl+
    11. "Endwert: " + result2);
    12. }

    VB.NET

    VB.NET-Quellcode

    1. Private Sub button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim begin = File.ReadAllText("text.txt")
    3. Dim bytes = File.ReadAllBytes("text.txt")
    4. Dim result = Convert.ToBase64String(bytes)
    5. Dim bytesBack = Convert.FromBase64String(result)
    6. File.WriteAllBytes("text.txt", bytesBack)
    7. Dim result2 = File.ReadAllText("text.txt")
    8. Dim nl = Environment.NewLine
    9. MessageBox.Show("Eingangs-Datei: text.txt" + nl + "Inhalt: " + begin + nl + "Base64: " + result + nl + "Endwert: " + result2)
    10. End Sub

    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „KaskadekingDE“ ()

    Tausch erstmal die Winsock mit den .Net funktionalitäten aus TCPListener/TCPClient...
    Außerdem ist es gar nicht nötig das ganze in Base64 zu konvertieren. Außerdem sendest du nur den Dateipfad, nicht die Datei selbst.

    Wie ich das lösen würde:
    Senden der String Länge
    Sende Dateinamen
    Sende Dateigröße
    Sende Dateiinhalt

    Der BinaryWriter(auf der Gegenseite Reader kann all das). Write(string) dürfte die ersten beiden Punkte sogar zusammenfassen. Anschließend kannst du mit Write(long/int) direkt einen Integer versenden und auf der gegenstelle entsprechend mit ReadInt32/64 empfangen.
    Dann weißt du auf wie viele Daten du warten musst und kannst so lange lesen, bis du die ganze Datei empfangen hast.

    Für Dateioperationen würde ich hier StreamReader/Writer empfehlen mit diesen ist es dir möglich die Daten gepuffert zu übertragen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---