Datei Stückchenweise über TCP/IP versenden

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von sycyrius.

    Datei Stückchenweise über TCP/IP versenden

    Hallo Forengemeinde,

    Ich möchte eine Datei über TCP versenden. Dazu habe ich eine Schleife programmiert, welche die Date stückchenweise einlesen und versenden soll.
    Hier der Code(bytelänge = Größe der Datei in Bytes, _stream = Networkstream):

    VB.NET-Quellcode

    1. Dim x as integer = 0
    2. While x < bytelänge
    3. x = binreader.Read(daten, x, daten.Length)
    4. _stream.Write(daten, 0, daten.Length)
    5. daten = Nothing
    6. End While

    Allerdings bekomme ich immer einen Fehler in der fünften Zeile. Könnte mir bitte jemand helfen...

    Danke im vorraus!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „sycyrius“ ()

    ja sicher, was für nen Fehler denn?(vorallem wird beim lesen binreader.Read(daten, x, daten.Length) an die Position X im Array geschrieben, das sollte wohl eher 0) sein...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Nein der binaryreader soll zwar anfangs an der Stelle Null anfangen zu lesen, aber beim zweiten Durchlauf soll das zweite Päckchen gelesen

    und versendet werden, also muss der Binaryreader anfangen bei 1024 aus der Datei zulesen.




    Die Fehlermeldung lautet: Der Zugriff auf den Pfad "pfad" wurde verweigert.

    Die Datei die ich ausgewählt habe ist keine Systemdatei und jedem zugänglich.


    Den Stream und den Binaryreader habe ich so deklariert:

    VB.NET-Quellcode

    1. Dim stream As New FileStream(txtDateipfad.Text, FileMode.Open)
    2. Dim binreader As New BinaryReader(stream)


    Liegt vlt. hier der Fehler???

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

    Ich nutze Windows 7.

    Die Datei liegt im C:\ - Verzeichnis und ich habe sie mit einem anderen selbst geschriebenen Programm bereits versendet.

    Dieses Programm konnte allerdings nur Dateien mit begrentzter Größe versenden, weshalb ich jetzt versuche ein neues Programm zu schreiben,

    welches auch größere Dateien versenden kann.
    versuch mal die datei ins Verzeichnis C:\Public\ zu verschieben, es könnte daran liegen, das alle oder auch nur einige deiner Programme keine Berechtigung besitzen auf den Pfad C:\ zuzugreifen, aber C:\Public\ ist ohne Zugangsrechte einsehbar
    Danke Goldwing Studios, anscheinend hatte das Programm doch keinen Zugriff auf die Datei. Im C:\Public Ordner funktioniert es!

    Allerdings habe ich jetzt zwei weitere Fragen:



    1. Wie kann ich das Empfängerprogramm die Schleife verlassen lasse, wenn alles übertragen wurde?
    2. Ich bekomme jetzt einen Fehler in der sechsten Zeile: "Das angegebene Argument liegt außerhalb des gültigen Wertebereichs. Parametername: size"

    Wieder Danke im Vorraus!
    x = binreader.Read(daten, x, daten.Length)

    ->
    damit erreichst du nur, dass x den Wert der restlichen Bytes bekommt(?), nicht aber die aktuelle Position, somit wird die While-Schleife nie verlassen...

    Edit: um das Ende zu erkennen, brauchst du entweder eine spezielle Byte-Abfolge, an welcher du das Ende der Datei erkennst, oder du musst zu beginn die Anzahl der Bytes schicken, damit der Client weiß, wie viel Bytes er empfangen muss...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    damit erreichst du nur, dass x den Wert der restlichen Bytes bekommt(?), nicht aber die aktuelle Position, somit wird die While-Schleife nie verlassen...
    Wie kann ich den erreichen, dass die While Schleife verlassen wird, sobald die Datei zu Ende gelesen wurde?

    EDIT: Weiß denn keiner eine Antwort???
    Hat vlt. jemand ein Codebeispiel??

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

    Wenn ich also zuerst die Länge in Bytes und dann die Datei sende kommt auf der Empfängerseite folgende Fehlermeldung:

    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Code des Senders:

    VB.NET-Quellcode

    1. While x < bytelänge
    2. x += binreader.Read(daten, x, daten.Length)
    3. _stream.Write(daten, 0, daten.Length)
    4. daten = Nothing
    5. End While


    Code des Empfängers:

    VB.NET-Quellcode

    1. While x < dateilänge
    2. daten = Nothing
    3. x += stream.Read(daten, 0, daten.Length)
    4. binwriter.Write(daten)
    5. End While
    Ich habe inzwischen selber eine Lösung gefunden. Vorher wird natürlich die Größe der Datei in Bytes gesendet.

    Code des Senders:

    VB.NET-Quellcode

    1. While x < bytelänge
    2. If bytelänge - x >= 1024 Then
    3. daten = binreader.ReadBytes(1024)
    4. Else
    5. daten = binreader.ReadBytes(bytelänge - x)
    6. End If
    7. _Networkstream.Write(daten, 0, daten.Length)
    8. x += daten.Length
    9. daten = Nothing
    10. End While




    Code des Empfängers:

    VB.NET-Quellcode

    1. While x < bytelänge
    2. If bytelänge - x < 1024 Then
    3. Dim daten(bytelänge - x - 1) As Byte
    4. x += _netstream.Read(daten, 0, daten.Length)
    5. binwriter.Write(daten)
    6. Else
    7. Dim daten(1024) As Byte
    8. x += _netstream.Read(daten, 0, daten.Length)
    9. binwriter.Write(daten)
    10. End If
    11. End While