Ağda Dosya Transferi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
X_ALPEREN_X
Üye
Mesajlar: 26
Kayıt: 20 Nis 2006 02:04

Ağda Dosya Transferi

Mesaj gönderen X_ALPEREN_X »

arkadaşlar ben idtcpserver ve idtcpclient ile ağda dosya transferi yapmaya çalışıyorum

Kod: Tümünü seç

CLİENT için

procedure TForm1.Button1Click(Sender: TObject);
var
dosya:TFileStream;
begin
dosya:=TFileStream.Create('c:\deneme.jpg',fmOpenRead);
IdTCPClient1.Connect();
IdTCPClient1.WriteStream(dosya);
end;

SERVER için

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
dosya:TFileStream;yol:AnsiString;
begin
dosya:=TFileStream.Create('c:\deneme1.jpg',fmCreate);
AThread.Connection.ReadStream(dosya);
end;
bu kodları kullanıyorum txt dosyaları gönderip alabiliyorum ama jpg veya başka tür dosyada sorun çıkıyor.dosyayı oluşturuyor fakat tam ggönderemiyor göndermeye çalıştıım dosyaların boyutları da küçük....
bu konuda yardımlarınızı bekliyorum...
X_ALPEREN_X
Üye
Mesajlar: 26
Kayıt: 20 Nis 2006 02:04

Mesaj gönderen X_ALPEREN_X »

129 ker görüntülenmiş 1 cevap bile yok :S kimse yokmu bu konuda bilgisi olan?
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Mesaj gönderen kahraman1285 »

Dostum Öncelikle bugün pazar ve herkes istirahat ediyor.

1.soruna cevap istemekte acele ediyorsun.

2.Indy konusubda bende çok zorlanıyor ve bazen foruma sorular soruyorum fakat cevap konusunda biraz sıkıntılar yaşıyorum.Sanırım Indy kullanan forum üyesi sayısı fazla değil.

3.Sana Indy örneklerine bakarak aynen uyguladığım bir yöntemi gönderiyorum

Kolay gelsin....

Server tarafı:

Kod: Tümünü seç

 if GelenEmir='uyeler' then
   begin
      Boyut:=data.UyelerStream.Size;
      AThread.Connection.WriteInteger(Boyut,True);
      athread.Connection.OpenWriteBuffer;
      AThread.Connection.WriteStream(Data.UyelerStream);
      AThread.Connection.CloseWriteBuffer;
   end;
Client tarafı:

Kod: Tümünü seç

procedure TAnaSayfa.UyelerTablosuAl;
var
ftmpStream:TFileStream;
Boyut:Longint;
a:string;
begin
   if FileExists(ExtractFilePath(Application.ExeName)+ 'bin\Uyeler.xml') then
      begin  DeleteFile(ExtractFilePath(Application.ExeName)+ 'bin\Uyeler.xml'); end;
if XmlClient.Connected=True then
  begin
   try
    XmlClient.WriteLn('uyeler//');
    ftmpStream := TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'bin\Uyeler.xml',fmCreate);
    Boyut:=XmlClient.ReadInteger(true);
    xmlclient.ReadStream(ftmpStream,boyut,false);
    FreeAndNil(fTmpStream);
    data.TumKullanicilar.Close;
    data.TumKullanicilar.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'bin\Uyeler.xml');
    data.TumKullanicilar.Open;
    data.Hat.Close;
    data.Hat.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'bin\Uyeler.xml');
    data.Hat.Open;
   
   except
    BaglantiHatasiBul;
   end;
  end else begin
     BaglantiHatasiBul;
  end;
end;
İşte hazır kod sana kopyala yapıştır...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Indy 10'dan daha eski bir sürümü kullandığın görülüyor ama bir şekilde cevap almak istiyorsan soru sorarken özellikle indy konusunda hangi sürümü kullandığını bildirmen gerekir. :idea:

- Çünkü indy 8, 9, 10 her seferinde kodlama sistemi değişmekte, gelişmekte. Şimdi cevap yazacak kişi kod gönderecek sen de çalışmıyor diyeceksin. Gönderen kişi daha iyi niyetli ise senin için diğer indy sürümüne göre araştırma yapmak durumunda kalacak. :oops:

- Şunu ifade etmeme izin verin, TCP protokolü dosya transfer etmez, byte byte veri akışını ( streaming ) yapabilir. Siz bir dosya transfer etmiş olmuyorsunuz, tren gibi ard arda dizilmiş byte'ları gönderiyorsunuz. :roll:

- Buna anlam kazandırmak için kuracağın protokol ile iki makinedeki projeni anlaştırman, birini beklemeye alıp, diğerinin ne göndereceğini ve aldığında ne yapacağını bildirecek ve anlayacak mekanizma kurman lazım.

- Protokol şu şekilde olabilir.

1. Client -> Server'e der ki, xxx dosyasını göndericem. Müsade et..
2. Server -> Client'e der ki, xxx dosyasını gönder bekliyor olucam....
3. Client -> Server'e Dosyayı STREAM olarak yollar.
4. Server ise gelen stream bitince, daha önce bildirilen xxx ismini bu streami dosyalaştırıp kaydeder.

- Bunu herhangi bir kontrolle yapabilirsin. Mesela bir TButton ile bir mesaj gönderebilirsin.

- Server'in OnExecute olayında tetik mekanizmaları bulunur. Gelen Text içeriği şu ise şu hazırlığı yap dersin. Gerekli Boolean tetik mekanizman hazır beklemeye başlar.

- Bir sonraki OnExecute olayında bu Boolean tetik mekanizması TEXT mesajı yerine doysa beklemeye başlar vs. bir time out veya kukla dosya yollayarak işlemi iptal edebilirsin.

- Ben kendi projelerimde farklı bir port ile sadece mesajlaşma işini yürütüyorum. Belli bir port ile sadece dosya transfer için kullanıyorum. Karar senin. :idea:

- Başarılar... 8)
Resim
Resim ....Resim
Cevapla