Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MemoryStream Sorunu
#1
Merhaba Arkadaşlar

Bir süredir üzerinde çalıştığım uygulamamda dosya gönderimi yapmak istiyorum bunun için memory stream kullanıyorum ama söyle bir problemim var gönderdiğim dosyayı part part göndermek isterken gönderdiğim dosyada bozulma oluyor ama partı dosya boyutuna eşitlediğim zaman dosyada bozulmadan gönderebiliyorum. Bir çok örnek denememe rağmen part part göndermeye çözüm bulamadım. (Not :Kullandığım versiyon Delphi xe 10.1 up 2)  
Bu konuda bilgisi olan arkadaşların yardımlarını bekliyorum. Şimdiden yardımlarınız için teşekkürler iyi çalışmalar.

Aşağıda kodları paylaşıyorum.


Server
var
tamboyut:int64;
.
.
.

procedure TDosyaal.serverexecute (AContext: TIdContext);
var
mem,files:TMemoryStream;
Dosyaname,yol: string;
begin
if AContext.Connection.IOHandler.ReadLn() = 'Dosya' then               
begin
tamboyut:=0;
dosyaname:=AContext.Connection.IOHandler.ReadLn();    
tamboyut:=strtoint64(AContext.Connection.IOHandler.ReadLn());
yol:='/sdcard/Download/'+dosyaname;
if DirectoryExists('/sdcard/Download/') = false then
begin
CreateDir('/sdcard/Download/');                              
end;
files:=TMemoryStream.Create;
end;

if AContext.Connection.IOHandler.ReadLn() = 'Dosya Al' then     
begin
mem:=TMemoryStream.Create;
AContext.Connection.IOHandler.ReadStream(mem,tamboyut, true);   
mem.Position:=0;
files.CopyFrom(mem,tamboyut);
mem.Free;
end;
if files.Size = tamboyut then
begin
files.SaveToFile(yol); 
files.Free;
end;
end;

Client

procedure TDosyayolla.Execute;
var
files:TFileStream;
mem:TMemoryStream;
yol: string;
i,Dosboyut,Boyutcount,tamboyut:integer;
begin
socket:=TIdTCPClient.Create();
socket.OnWork:=SocketWork;
socket.Host:=ip_cek;
socket.Port:=12672;
socket.Connect;
Sleep(500);
if socket.Connected = true then
begin
yol:=Dosya_cek;
files:=TFileStream.Create(yol,fmOpenRead + fmShareDenyNone);
socket.IOHandler.WriteLn('Dosya');  
socket.IOHandler.WriteLn(veri_cek); 
socket.IOHandler.WriteLn(inttostr(files.Size)); 
Dosboyut:=0;
Boyutcount:=0;
Dosboyut:=512000; //512 kb
Boyutcount:=files.Size div Dosboyut;
for I := 0 to Boyutcount do
begin
mem:=TMemoryStream.Create;

if (Dosboyut * i) < files.Size then
begin
files.Position:=Dosboyut * i;
if files.Position + Dosboyut < files.Size then
begin
mem.CopyFrom(files,Dosboyut); 
end
else
begin
mem.CopyFrom(files,files.Size - files.Position); 
end;
end
else
begin
Toast('Değer Fazla',ShortToast);
end;

socket.IOHandler.WriteLn('Dosya Al');
mem.Position:=0;
socket.IOHandler.Write(mem);
mem.Free;
end;
FreeAndNil(Files);   
socket.Disconnect;
socket.Free;
durum:='bitti';
end
else
begin
socket.Disconnect;
socket.Free;
end;
end;

alınan resim

6rE0vE.jpg

Gönderilen resim

VPGb8P.jpg
Cevapla
#2
Konu Güncel Arkadaşlar Sorun Devam Etmektedir.
Cevapla
#3
Dosya gönderirken paketlere bölerek her paketin gittiğinin teyidini almalısınız.
Mantık şu olmalı.
200 KB dosyanız olsun.
(1) Öncelikle kaç KB'lık paketler halinde yollayacağınıza karar verin. ( 64 KB diyelim )
(2) Gönderi başlangıcı bildiren bir işaretçiniz olsun. ( "send~" olsun )
(3) Sonra bu komutun ardında göndereceğiniz miktarı yazın. ( "uz64~" olsun )
(4) Şimdi de 200  KB'ın ilk 64 KB'lık kısmını bir MemoryStream'a alalım ve bunu gönderelim.
(5) Sonunda da "~ok~"  komutu gönderelim.
(6) 200 - 64 = 136 kaldı ( 3 nolu adımdan 6 nolu adıma kadar yineleyin )
(7) 6 nolu adımda sorgulayacaksınız önce (136-64 = 72 kaldı) sonra da ( 72-64 = 8 kaldı. )
(8) 2 nolu adımda 64 KB paket demiştiniz ya, uz64 yerine uz8 görünce anlayacağız ki paketlerin sonuna geldik. ya geriye kalan tamı tamına 64kb olsaydı değil mi ?  Exclamation
(9) Yani sonuna gelmesi bittiği anlamına gelmez. Finalde "uz" yerine ( "son~" ) mesajını yollayın ve transfer sonlansın.

her bir adımda da karşıdaki anladım diyeceği "ok~" gibisinden geriye bir geribildirim gönderin ki hazırım yolla gelsin demiş olsun  Smile

- Buradaki akışa protokol denir. Siz protokolünüzü ne kadar sağlam kurarsanız o kadar verim alırsınız. 

- Özetle "Her şeyi programa bırakmayın sihrinizi kullanın."
Idea
Başarılar.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#4
(21-01-2017, Saat: 14:36)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlDosya gönderirken paketlere bölerek her paketin gittiğinin teyidini almalısınız.
Mantık şu olmalı.
200 KB dosyanız olsun.
(1) Öncelikle kaç KB'lık paketler halinde yollayacağınıza karar verin. ( 64 KB diyelim )
(2) Gönderi başlangıcı bildiren bir işaretçiniz olsun. ( "send~" olsun )
(3) Sonra bu komutun ardında göndereceğiniz miktarı yazın. ( "uz64~" olsun )
(4) Şimdi de 200  KB'ın ilk 64 KB'lık kısmını bir MemoryStream'a alalım ve bunu gönderelim.
(5) Sonunda da "~ok~"  komutu gönderelim.
(6) 200 - 64 = 136 kaldı ( 3 nolu adımdan 6 nolu adıma kadar yineleyin )
(7) 6 nolu adımda sorgulayacaksınız önce (136-64 = 72 kaldı) sonra da ( 72-64 = 8 kaldı. )
(8) 2 nolu adımda 64 KB paket demiştiniz ya, uz64 yerine uz8 görünce anlayacağız ki paketlerin sonuna geldik. ya geriye kalan tamı tamına 64kb olsaydı değil mi ?  Exclamation
(9) Yani sonuna gelmesi bittiği anlamına gelmez. Finalde "uz" yerine ( "son~" ) mesajını yollayın ve transfer sonlansın.

her bir adımda da karşıdaki anladım diyeceği "ok~" gibisinden geriye bir geribildirim gönderin ki hazırım yolla gelsin demiş olsun  Smile

- Buradaki akışa protokol denir. Siz protokolünüzü ne kadar sağlam kurarsanız o kadar verim alırsınız. 

- Özetle "Her şeyi programa bırakmayın sihrinizi kullanın."
Idea
Başarılar.

Hocam Allah Razı olsun çok güzel bir fikir verdiniz. Her şey için çok teşekkürler özellikle protokol tanımınız için ayrı bir teşekkür ederim. Smile
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  ComboBox1.text sorunu arsl01 7 135 19-09-2018, Saat: 19:47
Son Yorum: engerex
Question uygulama donma sorunu - webbrowser BY-HAYALET 8 646 07-09-2018, Saat: 13:26
Son Yorum: nehirnnn
  Buton image sorunu (style) ahmetb 4 128 31-08-2018, Saat: 14:40
Son Yorum: mrmarman
  Android APİ sorunu - Google Play BY-HAYALET 23 1.159 23-08-2018, Saat: 18:54
Son Yorum: narkotik
  Listboxda SearchBox sorunu ahmetb 2 99 23-08-2018, Saat: 12:21
Son Yorum: ahmetb



Konuyu Okuyanlar: 1 Ziyaretçi