AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCP Client: Zu langer String?
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Client: Zu langer String?

Ein Thema von milos · begonnen am 27. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy TCP Client: Zu langer String?

  Alt 27. Aug 2014, 12:15
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
Angehängte Dateien
Dateityp: rar SmoothPrintServerTester.rar (923,2 KB, 1x aufgerufen)
Milos
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Indy TCP Client: Zu langer String?

  Alt 27. Aug 2014, 12:31
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.
$2B or not $2B
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy TCP Client: Zu langer String?

  Alt 27. Aug 2014, 12:39
Ja, Texte kann man standardmäßig nur bis

IOHandler.MaxLineLength Länge senden.

Der Defaultwert ist 16 * 1024.

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

IOHandler.MaxLineLength := MaxInt;
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Indy TCP Client: Zu langer String?

  Alt 28. Aug 2014, 07:36
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
Milos
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Indy TCP Client: Zu langer String?

  Alt 28. Aug 2014, 08:03

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?
Michael Justin

Geändert von mjustin (28. Aug 2014 um 08:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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