vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Senden eines Bildes über TCP 
Autor: silu
Datum: 18.10.11 11:22

Moin,

ich experimentiere im Moment ein bisschen mit den TCPClient/TCPListener Klassen herum und stoße hierbei auf ein Problem, welches ich nicht so recht nachvollziehen kann. Ich habe einen Client der bereits mit dem Server verbunden ist, Datenaustausch (Text) hat bereits stattgefunden, alles in bester Ordnung. Anschließend möchte der Client einen Screenshot an den Server schicken:

Dim screenImage As New Bitmap(My.Computer.Screen.Bounds.Width, _
  My.Computer.Screen.Bounds.Height)
Dim g As Drawing.Graphics = Drawing.Graphics.FromImage(screenImage)
g.CopyFromScreen(New Point(0, 0), New Point(0, 0), New Size( _
  My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height))
 
Dim ms As MemoryStream = New MemoryStream
 
screenImage.Save(ms, Drawing.Imaging.ImageFormat.Jpeg)
 
Dim jpegBytes() As Byte = ms.GetBuffer()
 
Me.sendMessage(MSG_SCREENSHOT_RESP, jpegBytes)
sendMessage macht in diesem Fall nichts anderes, als zwei Nachrichten an den Server zu schicken. Einmal eine 8 Byte Nachricht, welche den MessageCode (4 Byte) und die Länge des folgenden Datenblocks (4 Byte) enthält, und einmal den eigentlichen Datenblock. Da hab ich mich auch schon durch debuggt, sieht alles in Ordnung aus.

Der Server-Code zum lesen (läuft in einem separaten Thread in einer Endlosschleife):


 
Dim dataPacketSize As Integer = 0
Dim dataPacketSizeBuffer(3) As Byte
Dim messageTypeBuffer(3) As Byte
 
bytesRead = networkStream.Read(dataPacketSizeBuffer, 0, 4)
If bytesRead = 0 Then Exit While
dataPacketSize = BitConverter.ToInt32(dataPacketSizeBuffer, 0)
networkStream.Read(messageTypeBuffer, 0, 4)
messageType = BitConverter.ToInt32(messageTypeBuffer, 0)
 
ReDim dataPacketBuffer(dataPacketSize - 1)
networkStream.Read(dataPacketBuffer, 0, dataPacketSize)
Beim Server werden jeweils zwei Mal 4 Byte ausgelesen (MessageCode und Paketgröße), siehe oben. Das Konvertieren zum Image und das Anzeigen in der PictureBox folgen an anderer Stelle, stellen hier allerdings auch nicht das Problem da.

In 9 von 10 Fällen funktioniert diese Methode wunderbar, im 10. Fall passiert jedoch folgendes: Der Server liest die Bytes aus dem NetworkStream und konvertiert diese zurück zu einem Image und stellt es in der PictureBox da. Das Bild ist jedoch augenscheinlich beschädigt und nicht vollständig, sieht auf jeden Fall kaputt aus - ich gehe also davon aus, das sich der Client beim Senden irgendwie verschluckt hat. Dementsprechend stehen im networkStream anscheinend auch noch Daten, die read Methode liest nämlich wieder 4 Bytes aus, die wahrscheinlich noch zum Bild gehören. Diese zum Integer konvertiert ergeben eine exorbitant hohe Zahl und bei der Weiterverarbeitung kommt es dann irgendwann zum Absturz.

Kann man das irgendwie anständig nachvollziehen, was da passiert? Ich hab mich da die letzte Stunde durchdebuggt, allerdings keine bahnbrechenden Erkenntnisse errungen. Beim Senden ist mir nichts aufgefallen, wenn man dem glauben kann wurden da immer nur knapp 260.000 Bytes gesendet. Diese sollten beim Auslesen eigentlich auch alle erfasst wurden sein, trotzdem gibt networkStream.read noch was aus. Hat da jemand ne Idee?

Danke für eure Mühe.
-silu
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Senden eines Bildes über TCP2.552silu18.10.11 11:22
Re: Senden eines Bildes über TCP1.463Preisser18.10.11 11:41
Re: Senden eines Bildes über TCP1.262silu19.10.11 11:39

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel