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
Question [ ÇÖZÜLDÜ ] SQLİTE bağlantı sorunu BY-HAYALET 9 257 10-07-2018, Saat: 12:41
Son Yorum: BY-HAYALET
  Android APİ sorunu - Google Play BY-HAYALET 18 583 09-07-2018, Saat: 09:47
Son Yorum: quiet1day
  S9 Plus Donma Sorunu narkotik 13 304 16-06-2018, Saat: 19:00
Son Yorum: engerex
  AVD Manager Açılışta Ömür Yeme Sorunu? hyperxman 7 200 05-06-2018, Saat: 19:27
Son Yorum: codder71
  AndroidManifest Dosyasi Karakter Sorunu codder71 5 170 30-05-2018, Saat: 10:04
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi