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ı: 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.

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


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Webbrowser Sorunu [ÇÖZÜLDÜ] codder71 7 416 10-02-2026, Saat: 17:04
Son Yorum: codder71
  Orange UI nin 2.3 Free versiyonu Dil Sorunu ? ovural 0 266 12-11-2025, Saat: 16:53
Son Yorum: ovural
  IOS Uygulama Yayınlama Sorunu emrahozten 2 714 11-06-2025, Saat: 21:00
Son Yorum: hakan_cng
  Boyutlandırma Sorunu Coban 6 1.404 28-03-2025, Saat: 11:51
Son Yorum: Coban
  Tam ekran sorunu Altıner 31 5.476 25-01-2025, Saat: 16:29
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi