Bilder versenden funktioniert nicht!!!
-
Ich versuche gerade über Sockets ein Bild übers Netzwerk zu versenden, doch irgendwie wird nur ein Teil des Bildes empfangen und ich erhalte ein paar JPEG #52 Fehler.
sieht dann so aus:
http://michaelkircher.de.vu/bild.jpghab mir das schon durchgelesen...
http://www.c-plusplus.net/forum/viewtopic.php?t=43712&postdays=0&postorder=asc&start=0...und als Vorlage für meinen Code verwendet.
der Code zum versenden:
void __fastcall TForm2::SendButton4Click(TObject *Sender) { TJPEGImage *jpg = new TJPEGImage(); jpg->Assign(Image1->Picture->Bitmap); TMemoryStream *Stream = new TMemoryStream(); Stream->SetSize(0); Stream->Clear(); jpg->SaveToStream(Stream); Stream->Position = 0; if (Form1->ServerSocketImage->Active == true){ for (int i = 0; i < Form1->ServerSocketImage->Socket->ActiveConnections; i++){ Form1->ServerSocketImage->Socket->Connections[i]->SendStream(Stream); } } else { Form1->ClientSocketImage->Socket->SendStream(Stream); } delete Stream; delete jpg; }
und zum empfangen bei ServerRead (bzw. fast das gleiche bei ClientRead):
void __fastcall TForm1::ServerSocketImageClientRead(TObject *Sender, TCustomWinSocket *Socket) { TMemoryStream * Stream = new TMemoryStream; int Buffer; for (int i = 0; i < ServerSocketImage->Socket->ActiveConnections; i++){ Buffer = ServerSocketImage->Socket->Connections[i]->ReceiveLength(); } TJPEGImage *jpg = new TJPEGImage(); BYTE *Buffer_BYTEp = new BYTE[Buffer]; Stream->Position = Stream->Size; for (int i = 0; i < ServerSocketImage->Socket->ActiveConnections; i++){ ServerSocketImage->Socket->Connections[i]->ReceiveBuf(Buffer_BYTEp, Buffer); } Stream->Write(Buffer_BYTEp, Buffer); Stream->Position = 0; jpg->LoadFromStream(Stream); Form2->Image1->Picture->Bitmap->Assign(jpg); Form2->Visible = true; delete Stream; delete jpg; }
kann mir bitte jemand weiterhelfen warum der nicht das ganze Bild versendet?
-
Den ganzen Thread hast du dir aber nicht durchgelesen, oder? Insbesondere nicht die Teile, in denen es um ein "Protokoll" und den entsprechenden FAQ-Verweis geht!?
-
Nicht verzweifeln, nur dazu lernen!
Bevor du lange liest und doch nichts verstehst,
hier Kurz und Bündig:Was der Jansen mit Protokol meint ist, das bei jeder Übertragung
der Gegenstelle gesagt werden muß was los ist, da reicht ein "Ja hallo"
wie beim Telefonieren nicht aus. Wenn ein Internet Server einem Browser
ein Bild sendet sagt er ihm was es ist, also er sagt das es ein Bild ist
in Form von "Content-Type: image/jpg" so weiss der Browser das es ein
Bild ist und kein Text oder HTML. So ist es auch in deinem Fall, du mußt
der Gegenstelle schon sagen was du sendest damit er es weiss den sonst
giebt es nur Chaos. Um sich allgemein durch solchen Protokollen durch
zu studieren reicht dieses Forum vermutlich nicht, und du musst mal
googlen gehen um mehr darüber zu erfahren.Das sollte ein kleiner Anreiz sein um sich mit dem DFÜ Thema mehr zu
befassen, es giebt zu wenige....gruss promicha
-
Du hast dir die betreffenden Threads aber auch nicht durchgelesen, oder? Sonst hättest du sicher bemerkt, dass die Entwicklung eines solchen "Protokolles" vergleichsweise trivial sein kann, da es hier eben nicht darum geht, was versendet wird sondern nur darum, wieviel jeweils auf einmal versendet/empfangen werden kann bzw. darf.
Als konkretes Beispiel darf ich nochmal auf mein Simpel-Protokoll aus dem oben erwähnten Thread verweisen und für weitere Erläuterungen auf junix' FAQ-Beitrag.
-
Danke Jansen,
die Beiträge kenne ich, mit deren Hilfe habe ich ein kleines (Chat)
Messegner gebastelt womit meine Frau und ihre Schwester auch Bilder
und Sounds versenden können, klappt zu dem auch sehr gut.der Gegenstelle gesagt werden muß was los ist .....
.... Gegenstelle schon sagen was du sendest .... (*)
.... Um sich allgemein durch solchen ProtokollenIch habe die im Zeile 2 (*) im Quote wohl überheblich
geschrieben, da es zur Verwierung kamm, aber die 1. Zeile
weisst darauf hin das ich ein Protokol in welcher Form auch
immer meinte (auch in der simplen Form) und die 3. das ich es
im allgemeinen wünschenswert Finde wenn sich die Progger
mit jenem Thema besser auseinandersetzten. Schon klar das im
in dieser Form geholfen wird, aber auch später mal wenn er
eine z.B. Serveranwendung schreibt???
Ich denke es kann nicht schaden sich damit mal mehr zu Befassen.gruss promicha
-
Naja, in kleinen Schritten zum Erfolg. Solange er nicht versteht, was ein Protokoll grundsätzlich ist, hilft es ihm auch nicht, HTTP, FTP o.ä. zu verstehen. Aber lassen wir doch diese Diskussion jetzt und warten auf eine Reaktion seitens _Michi.
@_Michi: In dem von dir erwähnten Thread hats einige Links in andere Threads. hast du diese schon gelesen?
-junix
-
So hab die anderen verlinkten Threads jetzt auch gelesen.
Dass ich irgendwie die Größe des Streams/Bildes mitversenden muss war mir auch klar, als er nur ein Teil des Bildes empfangen hat, aber ich hab doch dafür bei der VAriable Buffer ReceiveLength verwendet.
Scheint aber nicht zu funktionieren!Hab das von junix mit seinem selbergebastelten Protokoll gelesen, wie es theoretisch funktioniert hab ich verstanden, es fehlt nur etwas an der umsetzung in nen Code.
Und wie mach ich, dass er nicht aufhört aus dem Socket zu lesen, sondern erst wenn das ganze Bild übertragen ist?@junix
kannst du etwas Beispielcode zu deinem Protokoll posten?
also wie ich an den Stream die Größe dranhänge, auslese, ...
-
J0 hatte doch genau die gleichen Probleme, die wir dann im Thread besprochen hatten?
-junix