Posilani souboru – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Posilani souboru  – Delphi – Fórum – Programujte.comPosilani souboru – Delphi – Fórum – Programujte.com

 

Remder0
Návštěvník
15. 1. 2011   #1
-
0
-

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

Nahlásit jako SPAM
IP: 109.238.35.–
nervak0
Věrný člen
16. 1. 2011   #2
-
0
-

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í.

Nahlásit jako SPAM
IP: 213.211.51.–
Remder0
Návštěvník
16. 1. 2011   #3
-
0
-

nervak napsal:
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í.



Ok ale jak narvu soubor do bufferu?

Nahlásit jako SPAM
IP: 109.238.35.–
nervak0
Věrný člen
16. 1. 2011   #4
-
0
-

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

Nahlásit jako SPAM
IP: 213.211.51.–
Remder0
Návštěvník
16. 1. 2011   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 109.238.35.–
nervak0
Věrný člen
16. 1. 2011   #6
-
0
-

Pro příjem budeš mít ten stream vytvořený s fmOpenWrite a budeš do něj zapisovat - stream.WriteBuffer. Data se budou přidávat na konec.

Nahlásit jako SPAM
IP: 213.211.51.–
Remder0
Návštěvník
16. 1. 2011   #7
-
0
-

nervak napsal:
Pro příjem budeš mít ten stream vytvořený s fmOpenWrite a budeš do něj zapisovat - stream.WriteBuffer. Data se budou přidávat na konec.



Super diky

Nahlásit jako SPAM
IP: 109.238.35.–
nervak0
Věrný člen
16. 1. 2011   #8
-
0
-

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.

Nahlásit jako SPAM
IP: 213.211.51.–
Remder0
Návštěvník
16. 1. 2011   #9
-
0
-

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.

Nahlásit jako SPAM
IP: 109.238.35.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý