Bild über TCP/IP

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Ferb300.

    Bild über TCP/IP

    Hi Community,
    Ich habe folgendes Problem: Ich möchte ein Bild über TCP/IP versenden. Ich habe mich hier schon etwas umgesehen und dabei herausgefunden, dass man es in ein Bitarray umwandeln muss. Das krieg ich hin, aber wie man es letztendlich versendet weiß ich nicht.
    Kann mir da jemand helfen?

    MFG Ferb300

    PS: Wenn es im falschen Bereich ist, bitte verschieben.
    umfassender HTML-Editor mit allem drum und dran: 40%

    Ferb300 schrieb:

    Das krieg ich hin, aber wie man es letztendlich versendet weiß ich nicht.
    Das ist schonmal schlecht, denn selbst für ne einfache übertragung brauchs eine Server-Client Struktur. Glücklicherweise gibt es für die TCP-Listener/-Client Klassen schon mehrere Tutorials hier aufm Board. Mit denen solltest du relativ schnell dazu kommen können, daten von A nach B zu schicken.

    Ferb300 schrieb:

    wie meinst du Bildschirmübertragung?

    Das ständige aufnehmen und schicken von Teilbildern des Desktops um der Gegenstelle zu zeigen was auf deinen PC passiert.

    EaranMaleasi schrieb:

    Das ist schonmal schlecht, denn selbst für ne einfache übertragung brauchs eine Server-Client Struktur.

    Ich weiß natürlich, wie man text über tcp/ip versendet, sonst würde ich so was ja gar nicht in angriff nehmen,
    mein Problem ist, das ich nicht weiß wie man ein bild (Bitmap) versendet.
    umfassender HTML-Editor mit allem drum und dran: 40%
    Rein theoretisch versendet man keine Texte, sondern immer nur Bytes, die sich dann z.B. zu Texten zusammen setzen lassen. Ich fragte weil TCP für eine dauerhafte (schnelle) Übertragung von Bildern nicht eignet, da es zu langsam ist.
    @Ferb300 Hast du denn das Bild vorliegend?

    Edit:

    ThuCommix schrieb:

    Ich fragte weil TCP für eine dauerhafte (schnelle) Übertragung von Bildern nicht eignet, da es zu langsam ist.

    Ich hab hier irgendwo eine alte Bildschirmübertragung mit TCP rumliegen, die nicht einmal paketweise sendet, und selbst die ist schön flott. Und auch nicht nur übers lokale Netz.

    Ferb300 schrieb:

    mein Problem ist, das ich nicht weiß wie man ein bild (Bitmap) versendet.

    Ferb300 schrieb:

    dass man es in ein Bitarray umwandeln muss. Das krieg ich hin,

    Ferb300 schrieb:

    Ich weiß natürlich, wie man text über tcp/ip versendet

    Was is also dein Problem? Wenn du es in ein ByteArray bekommst ist doch dein Weg für die Übertragung geebnet?
    Wie hast du denn bisher "Text" versendet? Nen NetworkStream und darauf nen StreamWriter?

    EaranMaleasi schrieb:

    Das ständige aufnehmen und schicken von Teilbildern des Desktops um der Gegenstelle zu zeigen was auf deinen PC passiert.

    Ja sowas hatte ich vor, aber ThuCommix hat recht, ich wollte eigentlich nur eine
    alle-5-sekunden-neues-bild-vorschau machen.

    So:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets, System.Threading, System.IO
    2. Public Class IPConnecter
    3. Friend ReceivedText As String
    4. Dim listener As New TcpListener(8000)
    5. Dim client As TcpClient
    6. Dim message As String = ""
    7. Sub Preparation(ByVal Port As Integer)
    8. listener.Start()
    9. Dim Listthread As New Thread(New ThreadStart(AddressOf listening))
    10. Listthread.Start()
    11. End Sub
    12. Sub Ending()
    13. listener.Stop()
    14. End Sub
    15. Private Sub listening()
    16. listener.Start()
    17. End Sub
    18. Sub Send(ByVal Message As String, Ip As Long)
    19. If Message = "" Then
    20. MsgBox("Message = 0")
    21. Else
    22. Try
    23. client = New TcpClient(Ip, 8000)
    24. Dim writer As New StreamWriter(client.GetStream())
    25. writer.Write(Message)
    26. Message = Nothing
    27. writer.Flush()
    28. Catch ex As Exception
    29. ' MsgBox(ex, MsgBoxStyle.Exclamation)
    30. End Try
    31. End If
    32. End Sub
    33. Sub Listen()
    34. If listener.Pending = True Then
    35. client = listener.AcceptTcpClient
    36. Dim Reader As New StreamReader(client.GetStream())
    37. While Reader.Peek > -1
    38. ReceivedText = ReceivedText + Convert.ToChar(Reader.Read()).ToString
    39. End While
    40. End If
    41. End Sub
    42. End Class




    umfassender HTML-Editor mit allem drum und dran: 40%
    Also so was?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net.Sockets
    3. Imports System.Threading
    4. Imports System.Drawing
    5. Imports System.Runtime.Serialization.Formatters.Binary
    6. Public Class ScreenPreview
    7. Dim client As New TcpClient
    8. Dim ns As NetworkStream
    9. Dim rd As IO.StreamReader
    10. Dim port As Integer
    11. Dim ip As String
    12. Public Function GetDesktopImage() As Image
    13. Dim bounds As Rectangle = Nothing
    14. Dim screenshot As System.Drawing.Bitmap = Nothing
    15. Dim graph As Graphics = Nothing
    16. bounds = Screen.PrimaryScreen.Bounds
    17. screenshot = New Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    18. graph = Graphics.FromImage(screenshot)
    19. graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    20. Return screenshot
    21. End Function
    22. Private Sub SendDesktop()
    23. Dim bf As New BinaryFormatter
    24. ns = client.GetStream
    25. bf.Serialize(ns, GetDesktopImage)
    26. End Sub
    27. Private Sub Connect()
    28. port = 'dein Port
    29. ip = 'deine IP
    30. Try
    31. client.Connect(ip, port)
    32. Catch ex As Exception
    33. Application.Exit() 'Wenn der Server nicht erreichbar ist oder was auch immer.
    34. End Try
    35. Timer1.Start() 'Den Timer-Interval dann halt auf 5Sek stellen
    36. End Sub
    37. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    38. SendDesktop()
    39. End Sub
    40. End Class


    Edit: Warum auch immer manche Zeilen nicht richtig eingerückt werden...
    @Ferb300
    Also, Du baust dir ne zweite "Send" funktion die anstatt nem String nun eben ein ByteArray als Parameter hat. Innerhalb der Funktion lässt du nun den StreamWriter weg und arbeitest direkt mit dem NetworkStream. Abgesehen davon, dass du bei der Write Methode mit angeben musst, ab welcher Stelle im Array er in den Stream scheiben soll, und wie viel er schreiben soll, gibt es (in deinem Fall) keinen Unterschied.

    Vainamo V schrieb:

    Edit: Warum auch immer manche Zeilen nicht richtig eingerückt werden...
    Das Problem hab ich auch immer ^^
    Cool, ich glaub, ich habs gecheckt, melde mich nochmal, wenns net funktioniert.
    Vielen Dank!

    PS:

    EaranMaleasi schrieb:

    Vainamo V schrieb:




    Edit: Warum auch immer manche Zeilen nicht richtig eingerückt werden...
    Das Problem hab ich auch immer


    Ich auch :D
    umfassender HTML-Editor mit allem drum und dran: 40%
    Ich denke, dass das senden geklappt hat (ungefähr nach @Vainamo V 's Methode)
    Aber wie empfange ich die Datei jetzt?
    umfassender HTML-Editor mit allem drum und dran: 40%
    Exakt umgekehrt:
    Du holst dir den Stream via .GetStream(), und übergibst den an die .deserialize() Methode des BinaryFormatters. Danach musst du noch auf Image, Picture, Bitmap oder was auch immer du geschickt hast casten, da der Rückgabetyp der .deserialize() Methode object ist.

    Hast du dann 2 verschiedene Methoden zum senden von Daten?
    Für den Einstieg: Universal Ticket.dll - Variablen ganz easy über's Internet versenden
    Damit kannst du direkt eine Bitmap-Variable senden und auf der anderen Seite als Variable wieder benutzen.
    Genau für solche Anwendungsfälle habe ich die .dll entworfen, damit ich mich nicht jedes mal um dieses Krams kümmern muss. ;)

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup: