Largestream vziw is 64-bit integer voor size.
Largestream vziw is 64-bit integer voor size.
Ik ben eerst eens een stuk terug gegaan, nu kan ik weer een verbinding maken tussen de Server en de Client.
Aan de Server zijde heb ik dit:
En aan de Client zijde dit:Code:procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var Port : Integer; PeerPort : Integer; PeerIP : string; msgFromClient : string; msgToClient : string; Received: String; ms:TMemoryStream; begin Memo1.Lines.Add('Test 1'); try ms:=TMemoryStream.Create; AContext.Connection.IOHandler.ReadStream(ms,-1,false); Memo1.Lines.Add('Test 2'); //ms.SaveToFile('c:\networked.bmp'); ms.SaveToFile('C:\=== DATA ===\TEST.jpg'); except //LogMessage('Failed to receive',clred); Memo1.Lines.Add('Test 3'); Memo1.Lines.Add( 'Failed to receive' ); end; end;
Als ik op Button3 klik dan krijg ik de melding: Ok 1Code:procedure TForm1.Button3Click(Sender: TObject); var FileName: string; Strm: TStream; begin FileName := 'C:\=== DATA ===\20190925_155655_001.jpg'; Strm := TFileStream.Create(FileName, fmOpenWrite); try try IdTCPClient1.IOHandler.Write(TStream(Strm), 0, True); finally Strm.Free; end; except //raise; //Verhogen ??? Memo1.Lines.Add('Ok 1'); end; end;
Maar aan de Server zijde niets.
Waarom zou de procedure IdTCPServer1Execute niet gestart worden ?
Als ik de verbinding verbreek, dan krijg ik:
Test 3
Failed to receive
WAAROM fmOpenWrite ????
fmOpenWrite
Open the file for writing only. Writing to the file completely replaces the current contents.
Ik dacht dit bestand moet geschreven worden naar de Client, maar heb dit nu gewijzigd naar fmOpenRead, en nu wordt het bestand blijkbaar verzonden (de Client/Server draait als test op dezelfde PC).
Er staat nu een bestand met de naam TEST.jpg op de Harddisk.
Kan ik deze opzet nu gebruiken voor zowel grote als ook kleine bestanden, en moet ik nog iets toevoegen om het betrouwbaar werkend te krijgen ?
Het 'schrijven' (dus verzenden) naar de client doe je door die iohandler.write. Bij het openen van het origineel bestand wil je daaruit natuurlijk alleen LEZEN aan de server kant.
Voor hele grote bestanden (groter dan 2,147,483,647 bytes, 2GB dus ) zou je aan beide kanten Largestream op true moeten zetten. Maar in dat geval lijkt mij een custom procedure met progressbalk wel handiger.
Hoe betrouwbaar dit allemaal is weet ik niet (geen ervaring mee).
Die wil ik er natuurlijk ook graag bij hebben.procedure met progressbalk
Op dit moment ben ik druk bezig om een verbinding te krijgen met een Android apparaat. Dat heeft gewerkt, maar nu wil dit even niet (iets met teveel test versies).
Edit:
Ik heb inmiddels ook een App werkend die het bestand kan ontvangen.
Hoe kan ik de naam van het verzonden bestand uitlezen zodat ik het Ontvangen bestand op kan slaan met dezelfde naam ?
Last edited by MMSoft; 11-Jul-21 at 20:40.
Ik zet de naam van het bestand in de stream voor het bestand en lees eerst deze naam uit, dat lijkt betrouwbaar te werken.
Ik zou alleen nog graag weten wanneer het bestand verstuurd en ontvangen is, zodat ik het volgende kan versturen.
Stel dat ik 40 foto's over wil zenden, mag ik die dan ongecontroleerd achter elkaar verzenden, of moet ik wachten op een signaal van de Server ?
Is er een specifieke reden dat je je eigen protocol probeert te maken en niet een kant en klare gebruikt (FTP, HTTP, ...) voor bestandsoverdracht of is dit gewoon een vingeroefening?
TMemoryLeak.Create(Nil);
Ik weet te weinig van deze materie om zelf een protocol op te kunnen zetten.
Het enige dat ik wil en nodig heb is een mogelijkheid om betrouwbaar meerdere bestanden over te kunnen zenden.
Ben ik zo goed bezig, of is er een betere/eenvoudigere manier voor mijn doel ?
Ik heb inmiddels 4 App's gemaakt om bestanden van en naar Windows en/of Android te zenden.
50 Foto's gaat zonder problemen. Er zitten nog wel een paar kleine bugjes in maar de App's, maar deze zijn alvast
bruikbaar voor mij.
Iedereen die meegedacht heeft bedankt, en op en of aanmerkingen blijven welkom.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks