Hilfe bei NetworkStream

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von xd-franky-5.

    Hilfe bei NetworkStream

    Hei Leute,

    Eine Frage zu meinem TCP-Chat undzwar :
    Wie verwende ich bei TCP den NetworkStream an das wenn ich auf einem Button drücke ein Bild aus ner Picturebox oder so abgesendet wird
    und ich sie dann beim anderen Client empfangen kann ?

    Hoffe ihr könnt mir helfen

    Mfg xd-franky-5
    @VincentTB
    Das hab ich alles schon gesehen aber ich hab nen ganz anderen Aufbau. Deshalb weis ich jetzt nicht wie ich des bei mir anwenden soll :(
    Kannst du mir da helfen ? Ich hab n Server und nen Client bzw. mehrere und wie soll ich das vom Server so allen Clients geben oder von Client zum Server und zu allen Clients ?
    Es gibst mehrere Möglichkeiten.

    Ich gebe Dir Stichworte, mit den Du dann Google verfüttern kannst...

    Eine Möglichkeit wäre, das Bild vor dem Senden in Bytes umzuwandeln, ImageToByte ...

    Oder nutze Winsock...

    Mfg.eniking1998

    enIking1998 schrieb:

    Oder nutze Winsock...
    Ohne groß zu flamen: nö.

    Wie du bereits richtig erkannt hast, musst du das Bild als rohe Bytes senden. Dazu dieses einfach in einen MemoryStream speichern z.B. so dotnet-snippets.de/snippet/bitmap-in-byte-array-schreiben/47.
    Nun hast du die Rohdaten des Bildes in einem Array. Diese schreibst du nun in den NetzworkStream(mit der Write-Methode natürlich). Somit kommt das Bild zum Server und dort leitest du die Rohdaten weiter. Sind alle Rohdaten empfangen müssen die Clients aus den empfangenen Rohdaten(dies kann auch schon während des Empfangen geschehen) diese wieder in einen Memorystream schreiben. Anschließend wird dieser Stream in Verbindung mit Image.FromStream verwendet um aus den Rohdaten wieder ein Bild zu erstellen.

    Je nach Szenario macht es Sinn eine gewisse Logik beim Senden zu erstellen. Sehr einfach ausgedrückt könnte dies z.B. heißen, dass du zuerst eine Zahl sendest welche angibt, dass nun ein Bild folgt. Anschließend noch eine Zahl welche die Länge der Rohdaten beinhaltet, da dann die Clients wissen wie viele Rohdaten noch kommen und wann das vollständige Bild empfangen ist.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Das sieht gut aus wie setze ich dort z.b. ne PictureBox ein ? :

    VB.NET-Quellcode

    1. Public Function Image2ByteArray(ByVal Bild As Image, ByVal Bildformat As System.Drawing.Imaging.ImageFormat) As Byte()
    2. Dim MS As New IO.MemoryStream
    3. Bild.Save(MS, Bildformat)
    4. MS.Flush()
    5. Return MS.ToArray
    6. End Function
    7. Public Function ByteArray2Image(ByVal ByAr() As Byte) As Image
    8. Dim img As Image
    9. Dim MS As New IO.MemoryStream(ByAr)
    10. 'das TRY ist Notwending, da wenn ein ARRAY eingelesen wird, welches KEIN Bild war,
    11. 'eine Exception auftritt!
    12. Try
    13. img = Image.FromStream(MS)
    14. Catch ex As Exception
    15. Return Nothing
    16. End Try
    17. Return img
    18. End Function


    Und wird das Bild das umgewandelt wurde als integer oder so gespeichert dann kann man das ja ganz einfach senden oder wie sieht das dann aus ?
    Was soll das heißen wie du eine PictureBox einsetzt? Eine PictureBox hat nix mit dem allem zu tun. Diese dient nur der Darstellung und ist irrelevant. Aber du kannst natürlich das Bild welches in der Image-Eigenschaft der Picturebox gespeichert ist in ein Byte-Array umwandeln oder ein Byte-Array in ein Image umwandeln und dieses der PictureBox zur Darstellung übergeben.

    Integer? Nö. Du wirst niemals ein Bild finden das nur 4 Bytes groß ist finden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Also, das mit dem Byte Array funktioniert bei mir nicht, ich weis nicht was ich falsch mache -.-
    Deshalb wollte ich fragen wie das mit der anderen Methode funktioniert (dieses WinSock) ? Kennt sich da jemand aus und kann mich da beraten ?

    Derzeitger Code der nicht funtzt :
    Spoiler anzeigen
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Net

    Public Class Form10
    Private ipAdress As IPAddress = Dns.GetHostAddresses("127.0.0.1")(0)
    Private listener As New TcpListener(ipAdress, 8000)
    Private client As TcpClient
    Private network As NetworkStream



    Dim length As Long = 0
    Dim store() As Byte

    Dim bmp As Bitmap


    Private Sub Form5_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
    listener.Start()
    client = listener.AcceptTcpClient()
    network = client.GetStream()

    Catch ex As Exception
    MessageBox.Show("Verbindung zum Server nicht möglich!")
    Application.Exit()
    End Try


    Timer1.Start()
    End Sub






    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    Try
    Dim clientSocket As New System.Net.Sockets.TcpClient()
    Dim serverStream As NetworkStream

    clientSocket.Connect("127.0.0.1", 8000)
    serverStream = clientSocket.GetStream()


    Dim bmp As Bitmap = New Bitmap(PictureBox1.Image.Width, PictureBox1.Image.Height)
    Dim g As Graphics = Graphics.FromImage(bmp)
    g.CopyFromScreen(0, 0, 0, 0, bmp.Size)

    Dim buffer() As Byte = Serialize(bmp)

    serverStream.Write(buffer, 0, buffer.Length)
    serverStream.Flush()
    Catch ex As Exception
    End Try


    Try
    Dim length As Long = 0
    Dim store() As Byte

    Dim bmp As Bitmap

    Do

    ReDim Preserve store(length + client.ReceiveBufferSize - 1)
    network.Read(store, length, client.ReceiveBufferSize)
    length = store.Count()

    Loop While network.DataAvailable

    bmp = Deserialize(store)

    PictureBox2.Image = bmp
    Catch ex As Exception
    End Try
    End Sub

    Private Function Serialize(ByVal data As Image) As Byte()
    Dim M As New IO.MemoryStream
    data.Save(M, System.Drawing.Imaging.ImageFormat.Bmp)
    M.Flush()
    Return M.ToArray()
    End Function

    Private Function Deserialize(ByVal data As Byte()) As Image
    Dim m As IO.MemoryStream = New IO.MemoryStream(data)
    Dim bm As Image = Image.FromStream(m)
    Return bm
    End Function

    End Class
    WinSock ist uralt, lass die Finger davon. Das FrameWork stellt Dir mehr als genug zur Verfügung, um auf richtige Art und Weise Daten zu übertragen. Dir wurden ja Links gepostet, wo genau das gemacht wird, was Du vor hast. Ich denke, mehr kann man Dir hier auch nicht helfen. Auf jeden Fall ist WinSock ein Schritt zurück in die Vergangenheit und hier kann Dir noch weniger jemand helfen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke erstmal,
    Ich hab die Links auch gesehen aber wie gesagt hab ichs net verstanden und der Code den ich jetzt zusammen gebastelt hab geht net, kannst du mir vllt. sagen warum ?
    Ich würd ihn mir vielleicht mal anguggn, wenn Du den Code zwischen VB-Tags schreibst. So hat ihn mit Sicherheit jeder einfach ignoriert.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hier nochmal (habs ganz vergessen) :

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Public Class Form10
    5. Private ipAdress As IPAddress = Dns.GetHostAddresses("127.0.0.1")(0)
    6. Private listener As New TcpListener(ipAdress, 8000)
    7. Private client As TcpClient
    8. Private network As NetworkStream
    9. Dim length As Long = 0
    10. Dim store() As Byte
    11. Dim bmp As Bitmap
    12. Private Sub Form5_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    13. Try
    14. listener.Start()
    15. client = listener.AcceptTcpClient()
    16. network = client.GetStream()
    17. Catch ex As Exception
    18. MessageBox.Show("Verbindung zum Server nicht möglich!")
    19. Application.Exit()
    20. End Try
    21. Timer1.Start()
    22. End Sub
    23. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    24. Try
    25. Dim clientSocket As New System.Net.Sockets.TcpClient()
    26. Dim serverStream As NetworkStream
    27. clientSocket.Connect("127.0.0.1", 8000)
    28. serverStream = clientSocket.GetStream()
    29. Dim bmp As Bitmap = New Bitmap(PictureBox1.Image.Width, PictureBox1.Image.Height)
    30. Dim g As Graphics = Graphics.FromImage(bmp)
    31. g.CopyFromScreen(0, 0, 0, 0, bmp.Size)
    32. Dim buffer() As Byte = Serialize(bmp)
    33. serverStream.Write(buffer, 0, buffer.Length)
    34. serverStream.Flush()
    35. Catch ex As Exception
    36. End Try
    37. Try
    38. Dim length As Long = 0
    39. Dim store() As Byte
    40. Dim bmp As Bitmap
    41. Do
    42. ReDim Preserve store(length + client.ReceiveBufferSize - 1)
    43. network.Read(store, length, client.ReceiveBufferSize)
    44. length = store.Count()
    45. Loop While network.DataAvailable
    46. bmp = Deserialize(store)
    47. PictureBox2.Image = bmp
    48. Catch ex As Exception
    49. End Try
    50. End Sub
    51. Private Function Serialize(ByVal data As Image) As Byte()
    52. Dim M As New IO.MemoryStream
    53. data.Save(M, System.Drawing.Imaging.ImageFormat.Bmp)
    54. M.Flush()
    55. Return M.ToArray()
    56. End Function
    57. Private Function Deserialize(ByVal data As Byte()) As Image
    58. Dim m As IO.MemoryStream = New IO.MemoryStream(data)
    59. Dim bm As Image = Image.FromStream(m)
    60. Return bm
    61. End Function
    62. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xd-franky-5“ ()