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;
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);
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.