Problem beim versenden eines Strings lNet

Alle Fragen zur Netzwerkkommunikation
Antworten
UnixX
Beiträge: 7
Registriert: Do 12. Okt 2017, 18:07

Problem beim versenden eines Strings lNet

Beitrag von UnixX »

Hallo Leute,

ich versuche ein Bild von Client zum Server zu versenden. Das Problem ist, dass der String nicht komplett beim Server ankommt.

Das Bild wird mit dem Code versendet (was auch funktioniert)

Code: Alles auswählen

procedure TForm1.sendpic_btnClick(Sender: TObject);
var
  jpg:TJPEGImage;
  sdata:string;
  stream:TMemoryStream;
begin
  jpg:=TJPEGImage.Create ;
  stream:=TMemoryStream.Create ;
  jpg.LoadFromFile ('See.jpg');
  jpg.SaveToStream (stream);
  stream.Position :=0;
 
  try
    setlength(sdata, stream.Size );
    stream.Read(sdata[1], stream.Size );
    ltcp.SendMessage (sdata);
    label3.Caption :='length sdata '+inttostr(length(sdata));                                                   //      <========== Länge des gesendeten Strings
  finally
 
  stream.Free ;
  jpg.Free ;
  sdata:=('');
end
end;


Server

Code: Alles auswählen

private
  sdata:string;
 
procedure TForm1.LTCPReceive(aSocket: TLSocket);
begin
  aSocket.GetMessage (sdata);
  if length(sdata) > 0 then
  label1.Caption := 'length sdata '+inttostr(length(sdata));         //  <========   hier sieht man schon, dass der String nicht vollständig ankommt. Beim mehrmaligen versenden des Strings entspricht irgendwann die Länge des empfangenen Strings der Länge des gesendeten Strings, dann lässt sich das Bild in die TImage problemlos laden.
 
end
 
procedure TForm1.start_btnClick(Sender: TObject);               // <========= Bild in die TImage laden
var
  s:string;
  stream:TMemoryStream;
  jpg:TJPEGImage;
begin
 
  jpg:=TJPEGIMAGE.Create ;
  stream:=TMemoryStream.Create ;
  stream.Write (sdata[1], length(sdata));
 
  stream.Position :=0;
 
  jpg.LoadFromStream (stream);
  image1.Picture.Assign (jpg);
 
  stream.Free ;
  jpg.Free ;
 
end


habe leider keine Idee wie ich das verbessern kann. Hoffe, dass einer von euch eine Lösung hat.

Vielen Dank im voraus!

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Problem beim versenden eines Strings lNet

Beitrag von sstvmaster »

Hi UnixX,

ich kann dir jetzt nicht direkt weiterhelfen, aber würde sagen das man Bilder und Dateien nicht als "String" versendet.
Bilder, Dateien werden eigentlich immer Binär übertragen, wegen den Steuerzeichen, die werden meiner Meinung nach
weg gemacht.

Ich würde das so machen:

Code: Alles auswählen

 
...
var
  ...
  sdata: TMemoryStream;
begin
  ...
  sdata := TMemoryStream.Create;
  try
    ...
    LTCPComponent1.Send(sdata, Sizeof(sdata));
  finally
    ...
    sdata.Free;
  end;
 
end;
 


Oder schau mal hier: https://forum.lazarus.freepascal.org/in ... pic=5146.0
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

UnixX
Beiträge: 7
Registriert: Do 12. Okt 2017, 18:07

Re: Problem beim versenden eines Strings lNet

Beitrag von UnixX »

Hallo,

vielen Dank für deine Antwort!
Ich werde es morgen mal ausprobieren.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Problem beim versenden eines Strings lNet

Beitrag von fliegermichl »

Schau mal auf der Github Seite von lnet nach. Da hat der Autor das Procedere ziemlich genau beschrieben. Es ist normal, daß längere Datenblöcke (egal ob strings oder binär) nicht auf einmal übertragen werden. Dafür gibt es die verschiedenen Events.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Problem beim versenden eines Strings lNet

Beitrag von corpsman »

Du kannst auch mal meine Chunkmanager Komponente Testen.

Die ist in der Lage auch Grpoße Daten als stream zu versenden und gibt dir auf der empfängerseite einen Event wenn alles Vollständig empfangen ist ;)
--
Just try it

Antworten