TCP Client Server: File Transfer über Lan fehlerhaft

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von CrackDash.NET.

    TCP Client Server: File Transfer über Lan fehlerhaft

    Hallo Gemeinde,

    nach langer Pause durch Krankheit und Stress kann ich endlich wieder an meinem Projekt weiterarbeiten. Nun hänge ich seit einigen Tagen an einem Problem. Ich habe auf Client und Serverseite jeweils eine Klasse geschrieben zum senden und empfangen von dateien... Das funktioniert suuuuuuuuper...LOKAL,.... sind client und server auf zwei pcs und und ich sende dann etwas, is die gesendete datei korrupt und kann nicht geöffnet werden.. ich hab alles mögliche versucht, aber ich komm einfach nicht drauf. ich poste mal die klassen:

    Server (empfangen):

    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


    Und hier der Client der sendet:

    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("192.168.2.118", 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


    Entweder hab ich einfach ne Blockade und seh die kleinigkeit nicht oder es ist wirklich was größeres schief gelaufen :D

    lg Litti
    Hey,

    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. Try
    6. If c.Connected Then
    7. RaiseEvent TransferBeginn()
    8. Dim s As NetworkStream = c.GetStream
    9. Dim fS As New FileStream(GetFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)
    10. Dim buffer(1024 - 1) As Byte
    11. Do While True
    12. Dim bytesRead As Integer = s.Read(buffer, 0, buffer.Length)
    13. If bytesRead = 0 Then Exit Do
    14. fS.Write(buffer, 0, bytesRead)
    15. Loop
    16. fS.Close()
    17. s.Close()
    18. c.Close()
    19. server.Stop()
    20. RaiseEvent TransferFertig()
    21. End If
    22. Catch ex As Exception
    23. server.Stop()
    24. RaiseEvent TransferFail(ex.Message)
    25. End Try
    26. End Sub
    27. End Class


    Mir ist irgendwie schleierhaft, warum Du beim Client nen FileStream nutzt und beim Server eine uralt FileOpen-Methode...? Vergleiche jetzt mal meinen Teil, den ich Dir gepostet habe mit Deinem Teil. Ich hoffe, den Fehler siehst Du selber?

    Ferner, ein Client sendet den Dateinamen schon mit, findest nicht? Was ist das denn, dass ich den Dateinamen selber bestimmen musss? Ich hoffe mal, dass Du das noch ausbesserst? Dann stehst Du nämlich schon vor der nächsten kleine Hürde. Dann brauchste ein kleines Protokoll, an das sich beide halten müssen. Erst Dateiname, dann ein OK, dass die Übertragung beginnen kann usw.... Aber, Du hast das Ganze ja schon mal gar nicht schlecht gemacht.

    Hau rein!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    hi, ich habe selber versucht den codeteil von litti übernommen nur habe ich probleme es anzupassen, denn eine verbindung besteht bereits zum Server/client


    VB.NET-Quellcode

    1. ...
    2. Private Sub ListenSub()
    3. Dim server As New TcpListener(IPAddress.Any, 2121) ' <--- ???
    4. server.Start()
    5. Dim c As TcpClient = server.AcceptTcpClient
    6. Try
    7. If c.Connected Then
    8. RaiseEvent TransferBeginn()
    9. ...

    wie konnte ich das so umschreiben das er die bestehende verbindung nutzt?

    wahrscheinlich werdet ihr mich nach meinem code fragen, also fragt was ihr braucht :P

    Gruß