Größere Dateien via TCP Verbindung verschicken.

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Größere Dateien via TCP Verbindung verschicken.

    Hey Leute, hier ist KenJy mal wieder...

    Ich habe keine gut
    passenden Themen gefunden die hier bereits existieren oder wollt sie
    nicht noch mal schänden, daher bitte ich euch hier um Hilfe.

    Ich habe folgenden Code für den Sender:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. 'Read the requested word document into a byte[]
    6. 'Dim fs As New IO.FileStream("C:\Users\Nutzer\Music\MusikDatei.mp3", IO.FileMode.Open, IO.FileAccess.Read)
    7. Dim fs As New IO.FileStream(TextBox2.Text, IO.FileMode.Open, IO.FileAccess.Read)
    8. Dim bytes(fs.Length) As Byte
    9. MsgBox(fs.Length.ToString) 'Die Länge in Bytes die die Datei hat
    10. fs.Read(bytes, 0, bytes.Length)
    11. fs.Close()
    12. 'Connect to the server.
    13. Dim client As New TcpClient()
    14. client.Connect(IPAddress.Parse("192.168.21.11").ToString, 25564)
    15. Dim ns As NetworkStream = client.GetStream
    16. ns.Write(bytes, 0, bytes.Length)
    17. End Sub
    18. End Class



    Und den Code für den Empfänger:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net.Sockets
    3. Imports System.Net
    4. Public Class Form1
    5. Private server As TcpListener
    6. Private client As New TcpClient
    7. Private versionnum As String = "0.5"
    8. Private Username As String = "Night-Light"
    9. Private Passwd As String = "PASSWD"
    10. Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 25564)
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. server = New TcpListener(ipendpoint)
    13. server.Start()
    14. While True ' wir warten auf eine neue verbindung...
    15. client = server.AcceptTcpClient
    16. Dim fs As IO.FileStream
    17. 'Create the filestream for the word document to be created.
    18. fs = New IO.FileStream(path, FileMode.Create, FileAccess.Write)
    19. Dim bytes(4096) As Byte
    20. Dim totalread As Integer = 0
    21. Dim bytesread As Integer = _client.GetStream.Read(bytes, 0, bytes.Length)
    22. 'read bytes from the network stream as long as there is data available and write to the file stream(word document)
    23. While _client.GetStream.DataAvailable
    24. fs.Write(bytes, 0, bytesread)
    25. bytes(4096) = New Byte
    26. totalread += bytesread
    27. bytesread = _client.GetStream.Read(bytes, 0, bytes.Length)
    28. End While
    29. 'Flush the stream so the bytes are written to the document, then close to release resources.
    30. fs.Flush()
    31. fs.Close()
    32. MessageBox.Show("Finished!")
    33. End While
    34. End Sub
    35. End Class


    Mein Jetziges Problem ist, dass er nach ein Paar millisekunden sagt: "Finished!"
    Jedoch ist die Datei immer unterschiedlich Groß und erreicht NIE die eigentlichen 12.980.055 Byte
    Mir
    wurde gesagt das ich ihm mitschicken soll wie Groß die Datei ist und
    dass dann in der While abfrage ersetzt... Quasi "While EmpfangenBy
    <> DateiBy ... "
    Nur weiß ich 1. nicht wie ich ihm die Datei
    Länge mitschicken soll und 2. habe ich dann (wenn ich einfach eingebe
    "While EmpfangenBy <> 12980055 ..." Also den Wert mit ins Programm
    schreibe) Das Problem, dass wenn er fast 100% geladen hat, und der
    Buffer nicht mehr vollständig gebuffert ist, er sich aufhängt und nicht
    mehr weiter macht oder sagt dass er fertig sei und DAS macht er immer
    wenn der Buffer halt nicht zu 100% gefüllt ist... und ich habe KP wie
    ich das bewerkstelligen soll...

    Desshalb bitte ich euch jetzt um
    Hilfe, da ich bis ca. 02:55Uhr Nachts noch daran gesessen habe und
    gerade nur noch am verzweifeln bin... v.v

    Gruß KenJy
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D

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

    Hab dir ein Beispiel mit einem Bild gemacht (funktioniert aber mit allem anderen genauso):

    Hier beim Sender:

    VB.NET-Quellcode

    1. Imports System.Runtime.Serialization.Formatters.Binary
    2. Imports System.Net.Sockets
    3. Imports System.Net
    4. Public Class Form1
    5. Private ipEndPoint As New IPEndPoint(IPAddress.Any, 8000)
    6. Private Server As New TcpListener(ipEndPoint)
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Server.Start()
    9. Dim newClient = Server.AcceptTcpClient 'Neu verbundener TCP-Client wird in Variable festgehalten
    10. With New BinaryFormatter() 'Mit neuem BinaryFormatter
    11. Dim img As Image = Image.FromFile("Pfad") 'Das Bild das gesendet werden soll
    12. .Serialize(newClient.GetStream, img) 'In den Networkstream wird das Bild (kann beliebiges Objekt sein, muss kein Bild sein!) hineingeschrieben.
    13. End With
    14. End Sub
    15. End Class


    Hier beim Empfänger:

    VB.NET-Quellcode

    1. Imports System.Runtime.Serialization.Formatters.Binary
    2. Imports System.Net.Sockets
    3. Imports System.Net
    4. Public Class Form1
    5. Private tcpClient As New TcpClient
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. tcpClient.Connect("127.0.0.1", 8000)
    8. Dim act As Action = AddressOf Read
    9. act.BeginInvoke(AddressOf act.EndInvoke, Nothing)
    10. End Sub
    11. Private img As Image
    12. Protected Sub Read()
    13. 'Empfangene Daten werden gelesen
    14. Do
    15. Dim client = tcpClient.GetStream
    16. If client.DataAvailable Then 'Wenn neue Daten im Stream vorhanden
    17. With New BinaryFormatter
    18. img = DirectCast(.Deserialize(client), Image) 'Deserialisiere im Stream und caste das Object in Bild (weil wir ein Bild gesendet haben)
    19. End With
    20. End If
    21. Loop
    22. End Sub
    23. End Class

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

    Also. Funktionieren tut es schonmal... DAS ist gut... ^^ aber, wie bekomme ich jetzt das Bild in eine Datei? Und 2. wenn ich das mit Musik mache, muss ich ja nur den Code abändern, der es spiziell auf ein Bild absieht...?
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D
    Okay, hat sich erledigt, funktioniert nicht mehr... Wie kann ich jetzt IRGENDEIN Objekt nehmen und verschicken? Bsp. eine Musik Datei, denn DAS Klapt nicht... -.-



    EDIT: Habs hinbekommen!
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KenJy_L4F“ ()

    Wie wärs wenn du anstelle des statischen Pfad zum Bild dir z.b. ein FilebrowserDialog einbaust? ;) Diesen Pfad hältst du in ner Variable und fertisch.....
    Es wurde ja erwähnt das, dass Beispiel zeigt wie man ein Bild sendet für ne Datei musst du schon etwas umschreiben. Copy&Paste und Auf Wiedersehen
    geht halt nicht immer :D
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snaptu“ ()