[gelöst] Lnet Große Datenmengen Senden und Empfangen

Alle Fragen zur Netzwerkkommunikation
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[gelöst] Lnet Große Datenmengen Senden und Empfangen

Beitrag von pluto »

Hallo

Bei meinem Projekt stehe ich gerade vor dem Problem, dass die Daten die ich vom Client zum Server Senden einfach scheinbar viel zu groß sind.
Eine Datei wäre z. b. um die 84,1 kb groß. Sie wird aber nicht vollständig Empfangen. Nur ein kleiner Teil kommt scheinbar an.

Es geht um eine Funktion, die es erlaubt, eine Json Datei direkt vom Client zum Server zu Senden, die wiederum in die Datenbank Importiert wird.
Das klappt, aber halt nur mit deutlich kleineren Datenmengen.

Es handelt sich dabei um eine bzw. mehrere Selbst erzeugte Json Dateien, im Client selbst wird die Datei richtig verarbeitet. Das Problem ist wohl beim Empfangen. Da der interne Buffer bei LNET scheinbar überläuft... Ich könnte die Datei natürlich anders aufteilen, aber das wäre nicht das "Ziel".

Meine Frage ist nun: Wie löse ich es am besten? hat Synapse hier eine "bessere" Lösung parat?
Lnet ruft beim nutzen von SendMessage intern die Methode Send auf, die wieder rum eine Variable Sendet, ohne Datentyp.
SendMessage konvertiert den String in einem PChar(Vielleicht ist das sogar das Problem).

Meine Idee wäre: Ein Receive, Request Manager zu erstellen. Der mit Threads arbeitet. Quasi zwei Haupt Threads hat, einem für das Senden und eine für das Empfangen.
Bei jeder Sendung die Empfangen wird, könnte ein Workter Thread Gestartet werden, der sich dann weiter darum kümmert.
Beim Senden, könnte die Datei dann in kleinen "Häppchen" gesendet werden und beim Client bzw. beim Server(je nach dem, wer gerade Sendet) wieder Zusammengebaut werden.

Ein erste Internet Suche, ergab leider zum Thema recht wenig, aber daraus ist die geschildete Idee entstanden.

Vielleicht habe ich auch mit den Falschen Begriffen gesucht:
Lnet fpc, long String Send

Edit4 Für alle die vor dem gleichen Problem stehen, die Lösung ist, bei größeren Text mengen die Sendung zwischen zu speichern und erst wenn alles Empfangen wurde, zu verarbeiten.
Ob das nun die Endgültige Lösung ist, weiß ich noch nicht... Die ersten Tests sehen gut aus.

Code: Alles auswählen

 
var
  s:string;
  len:Integer;
begin
  s:='';
  repeat
    len:=aSocket.GetMessage(s);
    BufferStr:=BufferStr + trim(s);
  until len = 0;
 
  if len = 0  then begin
    TextColor(LineColorIndex);
 
    writeln(#13, ' OnRe:',BufferStr);
    writeln();
 
    if LineColorIndex +1 <=15 then
      LineColorIndex:=LineColorIndex+1
    else
      LineColorIndex:=8;
    TextColor(LightGray);
 
    if (pos('{',BufferStr) > 0) and (pos('}',BufferStr) > 0) then
      ReceiveClass.Receive(BufferStr, aSocket);
    BufferStr:='';
  end;           
 


Edit3 Es gab noch ein Fehler beim "Server", darum gab es auch eine AV beim Empfangen, die Lösung aber für das Problem mit großen Datenmengen, scheint wohl an foSingleLineArray zu sein.
da sonst nicht alles ankommt.

Daher ist das Problem gelöst.

Edit2 wenn ich bei FormatJSON foSingleLineArray Setzte kommt sogar die ganze "Datei" an

Code: Alles auswählen

str:=jObject.FormatJSON([foSingleLineArray, foSingleLineObject]);
  len:=Length(str);
  ContentManagerClientAPI.Client.SendMessage(str);
 


Edit1 Ich habe hier eine Interessante Unterhaltung gefunden zum Thema gefunden:
https://lnet.wordpress.com/usage/socket ... d-sending/
Bei "November 4, 2009 at 13:11" gibt es einen Code, den ich wohl mal anpassen werden und testen werde.
MFG
Michael Springwald

Antworten