Entwickler-Ecke

Internet / Netzwerk - screenshot über sockets senden als stream


Maniacmd - Fr 11.09.09 20:32
Titel: screenshot über sockets senden als stream
hi,

ich habe mir im forum paar beiträge zum dateiversand über sockets durchgelesen und habe einen code geschrieben der von einem programm (bei mir der server) zu einem anderen (client) einen screenshot senden soll. der screenshot wird aber bei dem programm wo er hin gesendet wird nicht angezeigt.

das ist das program das den screenshot sendet


Delphi-Quelltext
1:
2:
3:
4:
5:
takescreenshot;

streambild:=tmemorystream.create;
image1.Picture.Bitmap.SaveToStream(streambild);
socket.SendStream(streambild);


und das der empfänger

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
streambild:tmemorystream;
bufferl:integer;
zeiger:pointer;
begin
Log.Lines.Add(Socket.ReceiveText);

streambild:=tmemorystream.Create;
bufferl:=socket.ReceiveLength;
getmem(zeiger,bufferl);
socket.ReceiveBuf(zeiger^,bufferl);
streambild.Write(zeiger^,bufferl);
image1.Picture.Bitmap.LoadFromStream(streambild);

end;



vielleicht wisst ihr wo das problem liegt

mfg


Xentar - Fr 11.09.09 20:36

Das orange tut ja in den Augen weh.. schau dir mal bitte an, wie man mit Delphi TAGs umgeht.

Zum Problem:
Du musst den Stream nach dem Beschreiben "zurückspulen".

Delphi-Quelltext
1:
Stream.Position := 0;                    


Maniacmd - Fr 11.09.09 20:48

wenn ich das "zurückspulen" dazuschreibe empfängt der client zwar irgendwas aber es scheint kein bild zu sein. das image bleibt leer, aber im log werden irgendwelche schriftzeichen ausgegeben. wenn ich die funktion log.lines.add weg lasse passiert einfach nichts


danke soweit erstma mfg


Xentar - Fr 11.09.09 21:12

Im Server musst du das natürlich auch machen, vor dem Versenden.


Maniacmd - Sa 12.09.09 17:29

alles klar ich habe jetzt die beiden zeilen einmal im server und im client eingefügt.
jetzt bekomme ich die fehlermeldung:
Bitmap image is not valid
in der image komponente wird ein schwarzes bild angezeigt


Xentar - Sa 12.09.09 18:36

Hmpf
speicher das doch erstmal testweise in einer Datei, und vergleich mal die Größen und sowas.

Außerdem:
Besser wäre es, wenn du vor dem eigentlichen Bild die Größe als Integer (bzw. int64) überträgst. Dann kann der Empfänger so lange warten, bis er wirklich alle Daten erhalten hat.


Maniacmd - Sa 12.09.09 19:04

das bild was ankommt ist 54kb groß und kann nicht angezeigt werden. die screenshot funktion wird aber richtig ausgeführt und beim sendenden programm richtig angezeigt also muss ja irgendwas beim senden schief gehn.


jaenicke - So 13.09.09 09:37

Dann schau dir eben einmal die ankommenden Daten an und vergleiche mit dem Original. Damit du weißt was da falsch ankommt, was also ggf. fehlt usw.
Aber user profile iconXentar hat ja auch schon die Größenangabe erwähnt, das reicht vermutlich schon. Der Rest wird vermutlich einfach nicht mitgespeichert.


Narses - So 13.09.09 11:04

Moin!

user profile iconManiacmd hat folgendes geschrieben Zum zitierten Posting springen:
ich habe mir im forum paar beiträge zum dateiversand über sockets durchgelesen
Welche Beiträge waren denn das? :?

user profile iconManiacmd hat folgendes geschrieben Zum zitierten Posting springen:
der screenshot wird aber bei dem programm wo er hin gesendet wird nicht angezeigt.
Das wundert mich nicht. :nixweiss:

user profile iconManiacmd hat folgendes geschrieben Zum zitierten Posting springen:
das ist das program das den screenshot sendet

Delphi-Quelltext
1:
2:
3:
4:
5:
takescreenshot;

streambild:=tmemorystream.create;
image1.Picture.Bitmap.SaveToStream(streambild);
socket.SendStream(streambild);
FAQ zum Thema Streams per Sockets versenden [http://www.delphi-library.de/topic_Warum+gibt+es+kein+ReceiveStream+bei+den+Sockets_65367.html]

user profile iconManiacmd hat folgendes geschrieben Zum zitierten Posting springen:
und das der empfänger

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
streambild:tmemorystream;
bufferl:integer;
zeiger:pointer;
begin
Log.Lines.Add(Socket.ReceiveText); // hier sind die empfangenen Daten bereits im Memo gelandet
Das kann nicht funktionieren, was du da machst. :| Abgesehen davon wird der Stream nicht als ein Stück gesendet, sondern in Teilen zu jeweils max. 8kb (in der default-Einstellung eines Sockets).

Am Besten vergisst du deinen Stream-Ansatz ganz schnell wieder und kümmerst dich um die Bilddaten selbst, dann klappt das auch. Hier ein Beispiel, das auf einem Terminatorzeichen basiert [http://www.delphi-library.de/topic_TerminatorzeichenProtokollTutorial++2+Sockets+v100_65487.html] und hier nochmal binär orientiert [http://www.delphi-library.de/topic_BinaerProtokollTutorial+Sockets+v100+MalChatFiles_66706.html].

Ach ja: Wenn du eine Delphi-Version >=2009 verwendest, dann klappt das alles hier nicht, da dort wegen dem generischen Unicode-String einiges anders gemacht werden muss. :idea:

cu
Narses


Maniacmd - So 13.09.09 12:49

ok danke jetzt gehts


Sithlord - Mi 21.10.09 13:46

Huhu,

sitze am gleichen Problem, kannst du mir mal bitte die Lösung dafür posten?
Würde sicherlich auch andere Interessieren!