Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy TCP Client: Zu langer String? (https://www.delphipraxis.net/181587-indy-tcp-client-zu-langer-string.html)

milos 27. Aug 2014 11:15

Indy TCP Client: Zu langer String?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich will mit Delphi einen Screenshot aufnehmen und ihn auf meinen vServer hochladen.
Ich mache dies momentan so:
Delphi-Quellcode:
// Erzeugt einen Base64-String aus der JPEG Bild-Datei die ich versenden will
function EncodeFile(const FileName: string): AnsiString;
var
  stream: TMemoryStream;
begin
  stream := TMemoryStream.Create;
  try
    stream.LoadFromFile(Filename);
    result := EncodeBase64(stream.Memory, stream.Size);
  finally
    stream.Free;
  end;
end;

// Kompressiert ein BMP in ein JPEG
procedure CompressImage(ImageFrom: TBitmap; ImageTo: TJPEGImage; Quality: integer);
var
  bmp: TBitmap;
  jpeg: TJPEGImage;
  stream: TMemoryStream;
begin
  bmp:=TBitmap.Create;
  jpeg:=TJPEGImage.Create;
  stream:=TMemoryStream.Create;
  try
    bmp.Assign(ImageFrom);
    jpeg.Assign(bmp);
    jpeg.PixelFormat:=jf24bit; // or jf8bit
    jpeg.CompressionQuality:=Quality;
    jpeg.ProgressiveDisplay:=False;
    jpeg.ProgressiveEncoding:=False;

    jpeg.Compress;
    jpeg.SaveToStream(stream);
    stream.Position := 0;
    ImageTo.LoadFromStream(stream);
  finally
    bmp.Free;
    jpeg.Free;
    stream.Free;
  end;
end;


// Erzeugt einen Screenshot
procedure ScreenShot(DestBitmap: TBitmap);
var
  DC: HDC;
begin
  DC:=GetDC(GetDesktopWindow);
  try
    DestBitmap.Width:=GetDeviceCaps(DC, HORZRES);
    DestBitmap.Height:=GetDeviceCaps(DC, VERTRES);
    BitBlt(DestBitmap.Canvas.Handle,0,0,DestBitmap.Width,DestBitmap.Height,DC,0,0,SRCCOPY);
  finally
    ReleaseDC(GetDesktopWindow, DC);
  end;
end;

// Fängt die PrintScreen-Taste auf
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  Screenshot(ss);
  image1.Picture.Bitmap := ss;
  FormStyle := fsStayOnTop;
  Show;
end;

// Upload-Funktion
procedure TForm1.Upload;
var
  URL: string;
  img :TJPEGImage;
  mes : string;
  cmds : TStringList;
  bmp : TBitmap;
begin

  img := TJPEGImage.Create;

  CompressImage(ss, img, Trackbar1.Position);

  img.SaveToFile('./Screenshot.jpeg');

  base64 := EncodeFile('./Screenshot.jpeg');


  idtcpclient1.IOHandler.WriteLn('start');


  idtcpclient1.IOHandler.WriteLn(base64); // Hier wird der Base64-String gesendet


  idtcpclient1.IOHandler.WriteLn('end');


end;
Das funktioniert auch eigentlich alles, aber nicht immer...
Kann es sein, dass der Base64 string zu lange ist?
Der Server ist in Java geschrieben, aber ich denke bei dem ist alles in ordnung.

Hier noch einige Bilder: (Alle nacheinander aufgenommen und hochgeladen ohne das Programm neu zu starten)
Qualität: 55%: http://www.app2k.de/images/nolmIrQ.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/lnmqLfl.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/LuelxSM.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/ZQRnbzN.jpeg Gescheitert

Falls es jemand selbst testen möchte, ich habe das Programm in den Anhang gelegt.
Wichtig:
  1. Die Anwendung ist in der Tray Leiste. Man sollte es mit der PrintScreen Taste hervor holen können. Bei mir auf dem Computer klappt das, aber auf meinem Laptop hat es beim ersten Test nicht geklappt. Falls es nicht gehen sollte kann man einen Doppelklick auf das Tray Icon machen und dabei erzeugt es auch gerade einen Screenshot.
  2. Falls eben so ein fehlgeschlagenes Bild kommen sollte, muss man das Programm neu starten. Den Fehler muss ich noch beheben.

Ich hoffe einer kann mir da helfen, finde ich recht merkwürdig warum das manchmal klappt und manchmal nicht... Das "end" kommt ja auch immer an o_O

Freundliche Grüsse

himitsu 27. Aug 2014 11:31

AW: Indy TCP Client: Zu langer String?
 
Irgendwie fehlt hier im Post das Wichtiste (hab jetzt noch keine Lust/Zeit das runterzuladen).
Wie wird die Datei empfangen?



Außerdem:
  • Relative Pfade (./Screenshot.jpeg) = böse
  • Warum überhaupt in eine Datei?
    Speichere das Bild doch einfach in einen MemoryStream.
  • Warum wird das als Text und nicht einfach binär gesendet? (am Besten mit längenangabe davor)
  • Die Start- und vorallem der Endmarker im Übertragungsprotokoll ist etwas ungünstig.
    Besser wäre es hier die Datenlänge anzugeben und nicht das Ende zu markieren. (macht den Empfang auch einfacher)


So, ich geh jetzt erstmal Mittag essen.

mjustin 27. Aug 2014 11:39

AW: Indy TCP Client: Zu langer String?
 
Ja, Texte kann man standardmäßig nur bis

Delphi-Quellcode:
IOHandler.MaxLineLength
Länge senden.

Der Defaultwert ist 16 * 1024.

Man kann diesen Wert aber erhöhen, z.B. auf MaxInt

Delphi-Quellcode:
IOHandler.MaxLineLength := MaxInt;

milos 28. Aug 2014 06:36

AW: Indy TCP Client: Zu langer String?
 
Ich würde ja gerne die Datei binär verschicken, jedoch weiss ich dann nicht wie ich diese mit Java empfangen kann.
Jeder versuch ist bisher gescheitert :/

Leider funktioniert die Methode mit .MaxLineLength auch nicht :(

Gibt es hier vielleicht jemanden der sich mit Java auskennt, oder weiss vielleicht jemand einen anderen Vorschlag?

Freundliche Grüsse

mjustin 28. Aug 2014 07:03

AW: Indy TCP Client: Zu langer String?
 
Zitat:

Zitat von milos (Beitrag 1270067)

Leider funktioniert die Methode mit .MaxLineLength auch nicht :(


Dann liegt seine Länge vermutlich unter der eingestellten MaxLineLength. Die erfolgreich übertragene Datei LuelxSM.jpeg hat eine Länge von 171 KB, korrekt? Dann ist das bereits über der standardmäßig in Indy eingestellten Länge. (Ich habe nicht genau recherchiert ob diese Begrenzung auf 16 KB möglicherweise nur für den Empfang gilt, vermutlich ist eine String-Übertragung beim Versand nicht in der Länge begrenzt).

Wie sieht denn der Java-seitige Code aus, in dem die Daten aus dem TCP Socket gelesen werden? Kann man da Loggingausgaben einbauen, um die Anzahl der erhaltenen Bytes mit den gesendeten vergleichen zu können?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz