Mám chat, celý je realizovaný pomoci clientsocket a server socket, všechny zpravy jdou na server a ten ji pošle klientu kterému je určena a chtel bych udělat aby se tímto způsobem daly posílat soubory.
Vím jak bych poslal soubor na server a pote klientovy (pres Stream), ale problem je v tom, že soubor nejdřive pošlu na server, musim cekat az se cely nahraje a pote urcitemu klientovy. To trvá dvakrat tak dlouho nez by bylo dobre a navic pri prijimani a posilani souboru program zamrzne , to by slo resit pres vlakna, ale v ty neumim a nechci se do nich poustet.
Kdybych posilal data z klienta na klienta, tak by to nebyl zas takovy problem, ale chci aby bezelo vsechno pres server.
Napadlo me ze bych soubor posilal napr po 20kb to by umoznovalo zaroven posilat data na server a ten by se v te same chvily uz posilal(mezitim bych mohl delat i jine veci a program by nezamrzl) s malym zpozdenim, ale netrvolalo by to 2x dlouho . Jenze nevim jak posilat soubor po castech a nasledne jak ho slozit. Tohle me napadlo ze by se to takhle dalo resit, ale asi bude i schudnejsi cesta jen o ni nevim.
A tak pisu jestli ma nekdo nejaky navrh nebo radu.
Predem diky
Fórum › Delphi
Posilani souboru
No, tak jak teď asi máš něco jako toto:
stream := TFileStream.Create(...);
socket.SendStream(stream);
Tak prostě nepošleš celý stream, ale pošleš ho po částech:stream.ReadBuffer(...buffer...);
socket.SendBuffer(...buffer...);
A obdobně pro čtení.nervak napsal:
No, tak jak teď asi máš něco jako toto:Tak prostě nepošleš celý stream, ale pošleš ho po částech:stream := TFileStream.Create(...);
socket.SendStream(stream);A obdobně pro čtení.stream.ReadBuffer(...buffer...);
socket.SendBuffer(...buffer...);
Ok ale jak narvu soubor do bufferu?
Tak jak jsem to napsal. Z toho streamu načteš část dat pomocí ReadBuffer
var
stream: TFileStream;
buffer: array[1..4096] of byte;
toread, bufsize: integer;
begin
stream := TFileStream.Create('file.xyz', fmOpenRead); // <--
toread := stream.Size;
while toread > 0 do
begin
bufsize := sizeof(buffer);
if bufsize > toread then bufsize := toread;
stream.ReadBuffer(buffer, bufsize); // <--
socket.SendBuffer(buffer, bufsize);
toread := toread - bufsize;
end;
stream.Free();
end
Dobry funguje mi to ale jen mi nefunguje skladani segmentu dohromady
mam
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
stream: TFileStream;
buffer: array[1..4096] of byte;
velbuf:integer
begin
socket.ReceiveBuf(buffer,velbuf);
stream.Read(buffer,velbuf);
end;
nejsem si jisty jak funguje nacitani do streamu jestli se timto zpusobem budou data pridavat nebo se budou prepisovat.
Ještě upřesnění.
Pokude cílový soubor neexistuje a chceš, aby se automaticky vytvořil, tak mode bude fmCreate or fmOpenWrite.
A přidávat se bude, dokud to bude ta samá instance streamu. Tj. nebudeš ho pořád znova vytvářet (šlo by to, kdybys vždycky zároveň použil Seek a nastavil pozici na konec), ale vytvoříš si ho na začátku přenosu a pak do něj jen budeš připisovat.
nervak napsal:
Ještě upřesnění.
Pokude cílový soubor neexistuje a chceš, aby se automaticky vytvořil, tak mode bude fmCreate or fmOpenWrite.
A přidávat se bude, dokud to bude ta samá instance streamu. Tj. nebudeš ho pořád znova vytvářet (šlo by to, kdybys vždycky zároveň použil Seek a nastavil pozici na konec), ale vytvoříš si ho na začátku přenosu a pak do něj jen budeš připisovat.
Jasny diky.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C# - NetworkStream - Posílání souboru/obrázku — založil NemeK
Posílání emailů ?? — založil wokena
Posílání proměných — založil Ruda
Posilani SmS ? — založil Odin
Posílání emailů — založil Kolotoc