Bildschirmübertragung mit Udp

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von MarioGeier00.

    VERZWEIFLUNG :P

    Ich möchte die Bytes in den MemoryStream am Server schreiben. Klingt einfach. Zustand sieht für mich aber anders aus. 8|

    Also wie lautet der Befehl, mit einer Instanz der Klasse TcpListener, die bereits gestartet und verbunden ist, die zu empfangenen Daten in den MemoryStream zu schreiben?

    Mit weihnachtlich sommerlichen Grüßen

    MaRiO GeIeR :D
    Der TcpListener hat eine Methode AcceptTcpClient(), welche einen TcpClient zurückgibt.
    Dadurch kannst du auf seine Methode .GetStream() zugreifen.

    Mit der Antwort auf stackoverflow : stackoverflow.com/a/10665486/5496071 sollte damit deine Frage geklärt sein.
    Und Gott alleine weiß alles am allerbesten und besser.
    Danke, aber das klappt ja nicht, da die Größe des streams mehr ist, also wir empfangen wollen. Habe beide befehle ausgeführt, funktioniert net.

    Ich klatsche euch einfach mal den Code hin. Es ist zu spät, um noch einen Roman zu schreiben, also schreibt mir bitte, was euch net passen würde ;)

    VB.NET-Quellcode

    1. Dim MainBitmap As New Bitmap(1366, 768) ' Meine Bildschirmgröße, ändere ich auch noch
    2. Sub TcpReceiver(IpEndpoint As IPEndPoint)
    3. Dim tcpListener As New TcpListener(IpEndpoint)
    4. tcpListener.Start()
    5. Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
    6. Dim networkStream = tcpClient.GetStream()
    7. Dim OutputImage, TileScreenImage As FastGraphicsLib.FastGraphics
    8. Do
    9. Dim dataBuffer(12 - 1) As Byte
    10. ' Eigenen Header lesen
    11. networkStream.Read(dataBuffer, 0, 12)
    12. ' Informationen konvertieren und zuweisen
    13. Dim dataLength = BitConverter.ToInt32(dataBuffer, 0)
    14. Dim TileScreen_x = BitConverter.ToInt32(dataBuffer, 0)
    15. Dim TileScreen_y = BitConverter.ToInt32(dataBuffer, 4)
    16. ' Datenbuffer erweitern, um mit größeren Packeten zu arbeiten
    17. ReDim dataBuffer(4096 - 1)
    18. Dim MemoStream As New MemoryStream
    19. Dim bytesRead = 0, actualBytesRead = 0
    20. ' Solange die gelesene kleiner als die gesamte Datenmenge -> Solange noch nicht alles gelesen
    21. While bytesRead < dataLength
    22. ' Lesen vom TcpClient
    23. actualBytesRead = networkStream.Read(dataBuffer, 0, dataBuffer.Length)
    24. ' gelesene Datenmenge aktualisieren
    25. bytesRead += actualBytesRead
    26. ' gerade gelesene Datenmenge in den MemoryStream, um später Bitmap.FromStream
    27. MemoStream.Write(dataBuffer, 0, actualBytesRead)
    28. End While
    29. ' Wenn das empfangene Bild nicht konvertiert werden kann, wieder neu empfangen
    30. Try
    31. TileScreenImage = FastGraphics.FromBitmap(Bitmap.FromStream(MemoStream))
    32. Catch : Continue Do : End Try
    33. ' Solange warten, bis das Bild verfügbar ist (verwende es außerhalb des Threads, weil ja mehrere Threads arbeiten und das Bild brauchen)
    34. Do
    35. Try
    36. OutputImage = FastGraphics.FromBitmap(MainBitmap)
    37. Exit Do
    38. Catch : End Try
    39. Loop
    40. For TileScreenImageHeight = 0 To TileScreenImage.Bitmap.Size.Height - 1
    41. For TileScreenImageWidth = 0 To TileScreenImage.Bitmap.Size.Width - 1
    42. Dim PixelColor = TileScreenImage.GetPixel(TileScreenImageWidth, TileScreenImageHeight)
    43. OutputImage.SetPixel(TileScreen_x + TileScreenImageWidth, TileScreen_y + TileScreenImageHeight, PixelColor)
    44. Next
    45. Next
    46. OutputImage.Unlock()
    47. Dim Mth_ActualiesePicture As ActualiesePicture = AddressOf ActualieseImage
    48. Mth_ActualiesePicture.Invoke(OutputImage.Bitmap)
    49. Loop
    50. End Sub
    51. Delegate Sub ActualiesePicture(ByVal Picture As Image)
    52. Sub ActualieseImage(Picture As Image)
    53. PictureBox.Image = Picture
    54. MainBitmap = Picture
    55. End Sub​


    Des mit dem Setpixel hab ich noch net raus: ich muss irgenwo noch nen unlock(bits) befehl hintun, weil er mir entweder bizarre Bilder liefert, oder er sagt mit, das er nicht aus geschütztem speicher lesen kann und das ein hinweis darauf sei, das das bild beschädigt sei.

    Mit freundlichen Grüßen

    Mario Geier

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