dateiübertragung über netzwerk ist unvollständig

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    dateiübertragung über netzwerk ist unvollständig

    Hallo VBler,

    ich habe ich TCP client server projekt und eine dateiübertragung die eigentlich super funktioniert! Wenn ich allerdings den client von einem anderen PC im netzwerk starte und mich mit dem Server verbinde, dann überträgt er die Daten nur Fehlerhaft..Also bei nem Bild fehlt z.B. etwas oder .exe sind korrupt...
    wird irgendwo ein byte zuviel oder zu wenig gesendet? hier mal mein code:

    Server und empfangen der Datei

    Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Net.Sockets
    4. Public Class DownloadFile
    5. Dim GetFile As String
    6. Public Event TransferBeginn()
    7. Public Event TransferFertig()
    8. Public Event TransferFail(ByVal message As String)
    9. Public Sub Beginn(ByVal Datei As String)
    10. Me.GetFile = Datei
    11. Dim t As New Threading.Thread(AddressOf ListenSub)
    12. t.IsBackground = True
    13. t.Start()
    14. End Sub
    15. Private Sub ListenSub()
    16. Dim server As New TcpListener(IPAddress.Any, 2121)
    17. server.Start()
    18. Dim c As TcpClient = server.AcceptTcpClient
    19. Try
    20. If c.Connected Then
    21. RaiseEvent TransferBeginn()
    22. Dim s As NetworkStream = c.GetStream
    23. FileOpen(1, GetFile, OpenMode.Binary)
    24. Dim buffer(1024 - 1) As Byte
    25. Do While True
    26. Dim bytesRead As Integer = s.Read(buffer, 0, buffer.Length)
    27. If bytesRead = 0 Then Exit Do
    28. FilePut(1, buffer)
    29. Loop
    30. FileClose(1)
    31. s.Close()
    32. c.Close()
    33. server.Stop()
    34. RaiseEvent TransferFertig()
    35. End If
    36. Catch ex As Exception
    37. server.Stop()
    38. RaiseEvent TransferFail(ex.Message)
    39. End Try
    40. End Sub
    41. End Class


    Client und senden der Datei:

    Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Net.Sockets
    4. Public Class UploadFile
    5. Dim SendFile As String
    6. Public Sub Beginn(ByVal Datei As String)
    7. Me.SendFile = Datei
    8. Dim sendThread As New System.Threading.Thread(AddressOf SendSub)
    9. sendThread.IsBackground = True
    10. sendThread.Start()
    11. End Sub
    12. Private Sub SendSub()
    13. Dim cli As New TcpClient
    14. Try
    15. cli.Connect("127.0.0.1", 2121)
    16. Dim nstm As Stream = cli.GetStream()
    17. Dim fstm As Stream = New FileStream(SendFile, FileMode.Open, FileAccess.Read)
    18. Dim buffer(1024 - 1) As Byte
    19. Do While True
    20. Dim bytesRead As Integer = fstm.Read(buffer, 0, buffer.Length)
    21. If bytesRead = 0 Then Exit Do
    22. nstm.Write(buffer, 0, bytesRead)
    23. nstm.Flush()
    24. Loop
    25. cli.Close()
    26. nstm.Close()
    27. fstm.Close()
    28. Catch ex As Exception
    29. End Try
    30. End Sub
    31. End Class


    Ich glaube ich überseh es einfach nur, aber deswegen frage ich euch ja ;)

    Gruß
    Litti
    Mit der Thematik hab ich mich noch nicht genau auseinandergesetzt, aber ich hätte da ein paar Ideen/Ansätze ;)

    - Fehlt immer der selbe Teil bei einem übertragenen Bild oder einer Datei? Oder Variiert das?
    - Wenn du die Bytes von der originaldatei mit der empfangen Datei vergleichst, stimmen diese überein?
    ----- Wenn ja, dann werden falsche Bytes übertragen
    ----- Wenn nein, dann werden zu wenige übertragen (oder zu viele aber das nehm ich mal nicht an)

    Vielleicht konnte ich dir ja neue Denkanstöße geben ;)

    LG spYro
    Ich glaube du verwendest das FilePut falsch (kann mich da aber auch irren, habe mich damit noch nie befasst). Was spricht dagegen die empfangenen Daten direkt auf die Platte zu schreiben? Funst mit einem StreamWriter einwandfrei:

    VB.NET-Quellcode

    1. Private Sub ListenSub()
    2. Dim server As New TcpListener(IPAddress.Any, 2121)
    3. server.Start()
    4. Dim c As TcpClient = server.AcceptTcpClient
    5. Dim StreamWriter As New IO.FileStream(GetFile, FileMode.OpenOrCreate)
    6. If c.Connected Then
    7. RaiseEvent TransferBeginn()
    8. Dim s As NetworkStream = c.GetStream
    9. Do While True
    10. Dim buffer(1024 - 1) As Byte
    11. Dim bytesRead As Integer = s.Read(buffer, 0, buffer.Length)
    12. If bytesRead = 0 Then Exit Do
    13. StreamWriter.Write(buffer, 0, bytesRead)
    14. Loop
    15. s.Close()
    16. c.Close()
    17. server.Stop()
    18. RaiseEvent TransferFertig()
    19. End If
    20. StreamWriter.Close()
    21. StreamWriter.Dispose()
    22. 'Catch ex As Exception
    23. ' server.Stop()
    24. ' RaiseEvent TransferFail(ex.Message)
    25. 'End Try
    26. End Sub


    EDIT: eine Frage: Deine bisher empfangenden Daten waren immer exakt 1024Byte groß (egal wie groß die gesendete Datei war) oder?

    lg

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