![]() |
Image senden - Bin kurz vorm verzweifeln
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich versuche jetzt schon seit Tagen ein ganz normales Bitmap mit den Client/Server-Komponenten zu versenden. Das Bild soll vom Server verschickt werden und am Client ankommen. Was ich nicht so ganz verstehe ist, dass ich das ganze bereits erfolgreich realisiert habe, allerdings beides zusammen in einem Programm (Server und Client befinden sich auf ein und der selben Form und der Server sendet das Bild übers Netzwerk zum eigenen Programm zurück). Nun hab ich das ganze getrennt in jeweils ein eigenes Programm gesteckt und bin davon ausgegangen, dass es jetzt auch funktioniert, aber das tut es leider nicht. Ich bekomme immer eine Access violation aber ein Bild kommt nicht an... Das Programm befindet sich in der Anlage... Ich hoffe, ihr könnt mir helfen das Problem zu lösen! Mit freundlichen Grüßen Philipp |
Re: Image senden - Bin kurz vorm verzweifeln
Hallo,
such hier im Forum mal nach den besonderheiten vpn Sockets, da erfährst du z.B. das: Wenn du eine Nachricht mit einem Socket versendest, kannst du nicht davon ausgehen, dass die Nachricht auch in einem Stück wieder ankomt, es passiert häufig, dass sie zerlegt wird. Also musst du dafür sorgen, dass die Datei beim CLient wieder zusammengesetzt wird. Viele Grüße, Benjamin |
Re: Image senden - Bin kurz vorm verzweifeln
Hallo,
guck mal hier in der OpenSource spalte: ![]() Das ist ein von mir programmierter Chat, der auch die Sockets benutzt, um Dateien (auch Bilder) zu verschicken. Diese Funktion ist ein TChatServer und TChatClient implementiert. Florian |
Re: Image senden - Bin kurz vorm verzweifeln
Zitat:
Zitat:
Beim Senden von Strings kommt immer alles komplett an... Kannst du mir erklären, wie man die Teile zuammenfügt? :oops: |
Re: Image senden - Bin kurz vorm verzweifeln
Zitat:
Aber die sind ja laut Beschreibung lediglich abgeleitet, das bedeutet doch dann, dass es auch mit den "normalen" Komponenten gehen müsste, oder? |
Re: Image senden - Bin kurz vorm verzweifeln
So, noch mal gesucht:
Das hier muss ins OnClientRead Ereigniss des TClientSockets:
Delphi-Quellcode:
FDaten: boolean;
Var
a: array[0..4096] of byte; i: integer; s: string; fs: tfilestream; begin If FDaten = false then begin s := Socket.ReceiveText; If Copy(s, 1, 5) = 'Daten' then begin Delete(s, 1, 5); try FSize := StrToInt(s); FDaten := true; FStream.Clear; except end; end; end else begin i := Socket.ReceiveBuf(a, 4096); FStream.Write(a, i); FPos2 := FPos2 + i; // hiermit prozent ermitteln: floattostr(Round((fpos2 / fsize)*100)); If FPos2 >= FSize then begin FDaten := false; FStream.Position := 0; FPos2 := 0; end; end; FSize: int64; Fpos2: int64; FStream: TMemoryStream; als globale Veriablen definieren! und das hier muss zum Senden benutzt werden:
Delphi-Quellcode:
ClientIndex gibt die Nummer des Clients an.
procedure SendFileToClient(clientindex: integer; filename: string);
Var i: integer; Buf: Pointer; begin fstream.LoadFromFile(filename); Buf := FStream.Memory; serversocket1.Socket.connections[clientindex].SendText('Daten'+inttostr(fstream.size)); sleep(sleeptime+50); serversocket1.Socket.connections[clientindex].SendBuf(buf^, fstream.Size); end; Florian PS: Ja, es geht auch mit den normalen Komponenten. |
Re: Image senden - Bin kurz vorm verzweifeln
Es funktioniert leider immer noch nicht...
Ich hab das Programm so umgeschrieben, dass es den Stream nicht aus einer Datei, sondern aus dem Bild selber (wie in meinem Versuch) erhällt. Als ich das ganze gestartet hab, kam auf der Client-Seite wieder diese Zugriffs-Verletzung und mir ist aufgefallen, dass der Stream nicht "Created" wurde. Das hab ich geändert und jetzt kommt ein "Stream Read Error"... Das kann doch nicht so kompliziert sein, oder? |
Re: Image senden - Bin kurz vorm verzweifeln
Also: im OnCreate Ereigniss des Formulars:
Delphi-Quellcode:
zum speichern des Bildes im Stream:
FStream := TMemoryStream.Create;
Delphi-Quellcode:
Zum auslesen des Bildes bei dieser Stelle:
FStream.Clear;
Image.Picture.SaveToStream(FStream);
Delphi-Quellcode:
Müsste gehen!
If FPos2 >= FSize then
begin [b]Image1.Picture.LoadFromStream(FStream);[/b] FDaten := false; FStream.Position := 0; FPos2 := 0; end; Florian |
Re: Image senden - Bin kurz vorm verzweifeln
Jetzt kommt wieder die AccessViolation... :wall:
Ich krieg das irgendwie nicht auf die Reihe... Kannst du mir ein komplettes Programm schicken, in welchem der Stream aus einem Image geladen und beim Client wieder in ein Image gepackt wird? :oops: |
Re: Image senden - Bin kurz vorm verzweifeln
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz