Autor Beitrag
Maniacmd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 94

Windows XP
Delphi 7 Personal
BeitragVerfasst: Fr 11.09.09 20:32 
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

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

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


und das der empfänger
ausblenden 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


Zuletzt bearbeitet von Maniacmd am Fr 11.09.09 20:41, insgesamt 1-mal bearbeitet
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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".
ausblenden Delphi-Quelltext
1:
Stream.Position := 0;					

_________________
PROGRAMMER: A device for converting coffee into software.
Maniacmd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 94

Windows XP
Delphi 7 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 11.09.09 21:12 
Im Server musst du das natürlich auch machen, vor dem Versenden.

_________________
PROGRAMMER: A device for converting coffee into software.
Maniacmd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 94

Windows XP
Delphi 7 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.

_________________
PROGRAMMER: A device for converting coffee into software.
Maniacmd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 94

Windows XP
Delphi 7 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
ausblenden 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

user profile iconManiacmd hat folgendes geschrieben Zum zitierten Posting springen:
und das der empfänger
ausblenden 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 und hier nochmal binär orientiert.

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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Maniacmd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 94

Windows XP
Delphi 7 Personal
BeitragVerfasst: So 13.09.09 12:49 
ok danke jetzt gehts
Sithlord
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: 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!