Delphi Indy bileşenkeri ile ağ programlaması

Bu dersimizde Delphi'de yerleşik olarak bulunan indy bileşenleri ile soket programlama konusu ele almaya çalıştık.

Delphi'de yerleşik olarak bulunan indy bileşenleri ile soket programlama konusunu ele alalım.

Bu derste şunları ele alacağız:

* Ağ programları,sunucu ve kullanıcı olmak üzere iki kısımdır.

* Indy bileşenleri ile ağ programlaması yapılabilir.

* İletişim için IdTCPServer ve IdTCPClient bileşenlerinin IP ve Port özellikleri ayarlanır.

* IdThreadMgrDefault bileşeni, sunucuya bağlanan her bir kullanıcı için bir kanal oluşturur.

* IdTcpServer ın OnConnect olayı, IdTCPClient ın Connect komutuyla sunucuya bağlanmasıyla gerçekleştirilecek işlemleri içerir.

* Sunucuya bağlanan her kullanıcı, sunucunun kullandığı TThreadList nesnesine eklenir.Ve her bağlantıda, kullanıcı bilgileri, TIdPeerThread nesnesinin Data özelliğine atanır.

* Write ve Read komutlarının farklı formatlarıyla, yazma ve okuma işlemleri gerçekleştirilir.Sunucu tarafında, TIdPeerThread nesnesininn Connection sınıfının Write veya Read özellği kullanılır. TIdTCPClient ın ise, kendi okuma ve yazma fonksiyonları ile işlemler gerçekleştirilir.

* Bağlantı, IdTCPServer ın Active özellğinin false yapılması veya kullanıcı tarafında, bağlantının TIdTCPClient ın Disconnect komutuyla sonlandırılması gibi işlemlerle sonlandırılır.

1. GİRİŞ

Günümüzde kullanılan sistemlerin önemli bir kısmında, yapılan işlemler, bir noktadan kontrol edilme mantığıyla yürütülmektedir.Üretilen projeler, genellikle ağa(network) yöneliktir.Bu da ağ programcılığını öğenmeyi kaçınılmaz kılmaktadır.
Bu nedenle, bu makalede, Delphi'de yerleşik olarak bulunan indy bileşenleri kullanılarak ağ ortamında programlama konusu işlenecektir.

2. TEMEL BİLGİLER ve ÖRNEK KODLAR

Ağda çalışan uygulamalar, kullanıcı ve sunucu (client/server) olmak üzere iki kısımdan oluşur.
Indy bileşenlerinden, Indy Servers sekmesindeki IdTCPServer, sunucu; Indy Clients sekmesindeki IdTCPClient ise kullanıcı programında kullanılır.Indy kanal(thread) problemini kendi içinde çözmüştür.Indy Misc sekmesindeki IdThreadMgrDefault adlı bileşen ile sunucuya her bağlanan kullanıcı için ayrı bir kanal oluşturulur ve böylece aynı anda sunucuya bağlanmaya çalışan kullanıcılar arasında bir çatışma oluşmaz.Bu bileşen de IdTCPServer ile ThreadMgr özelliğinden ilişkilendirilir.

Bir sunucu ile kullanıcının etkileşimi için bazı ayarlar yapılmalıdır.Bunlar genellikle formun OnCreate olayında belirtilir.

Yapılması gereken ayarlar:

i. Sunucunun ip özelliğinin,sunucuya bağlanan kullanıcının ip si; kullanıcının ip özelliğinin de sunucunun ip si olarak ayarlanması,

ii. İletişim için kullanılan port numarasının ayarlanması,

iii. Sunucunun aktif hale getirilmesi.

A. Sunucunun(Server) Özelliklerinin Ayarlanması:

İp ve port un belirlenmesi , IdTCPServer ın Bindings özelliğinde belirtilir.


Bindings := TIdSocketHandles.Create(IdTCPServer); 

try 

with Bindings.Add do

 begin 

IP := '127.0.0.1'; 

Port := 7575; 

end; 

try

TCPServer.Bindings := Bindings; 

TCPServer.Active := True; 

except on E:Exception do

ShowMessage(E.Message); 

end;

 finally Bindings.Free; 

end;



Sunucuya bağlanan kullanıcılar,sorunsuz bir kanal modeli için TThreadList sınıfından türetilen bir nesnede depolanırlar."KullaniciListesi", TThreadList sınıfının bir örneği olarak varsayılırsa, yine formun OnCreate olayında aşağıdaki ayarlamalar gereklidir:


KullaniciListesi := TThreadList.Create;

KullaniciListesi.Duplicates := dupAccept;



Kullanıcılar, bir nesne şeklinde bu "KullaniciListesi" nesnesine eklenirler. Her bir kullanıcı, sunucuya bağlandığı anda bu listeye eklenir.Bunun için kullanıcı ile ilgili bilgilerin tutulduğu, bir kayıt oluşturulup, bu kayıt bir nesne şeklinde "KullaniciListesi" nesnesine eklenir.Ve bağlantı koptuğunda da listeden çıkarılır.

Bu işlemler için ilgili kodlamalar aşağıdaki gibidir:


type

Kullanici= ^TKullanici; 

TKullanici = record 

HostName : String[20]; { Hostname } 

PeerIP : string[15];        { Kullanıcıt IP adresi} 

Thread : Pointer;           { Kanala işaretçi(pointer)} 

end; 

...

procedure Form1.IdTCPServerConnect(Kanal: TIdPeerThread);

var

  YeniKullanici: Kullanici;

begin

  GetMem(YeniKullanici, SizeOf(TClient));



  YeniKullanici.PeerIP     := Kanal.Connection.Socket.Binding.PeerIP;

  YeniKullanici.HostName   := GStack.WSGetHostByAddr(YeniKullanici.PeerIP);

  YeniKullanici.Thread     := Kanal;



  Kanal.Data := TObject(YeniKullanici);



  try

    KullaniciListesi.LockList.Add(YeniKullanici);

  finally

    KullaniciListesi.UnlockList;

  end;

 end; 

[code]



B. Kullanıcının(Client) Özelliklerinin Ayarlanması:



İp ve port değerleri, IdTCPClient ın Host ve Port özelliklerine girilir.Ve IdTCPClient ın Connect komutuyla bağlantı sağlanır.



[code]

try

 IdTCPClient.Host := '127.0.0.1';

 IdTCPClient.Port := 7575; 

IdTCPClient.Connect; 

except on E: Exception do 

ShowMessage( 'Bağlantı Yok');

[code]



Kullanıcının, sunucuya bağlandığında yapılması istenen işlemler ise, IdTCPServer ın OnExecute olayında belirtilir.



Ağ programlarında normalde iletişim kullanıcının sunucuya istek göndermesiyle başlar.Ve ardışık okuma ve yazma işlemleri ile iletişim sürdürülür ve sonlandırılır.IdTcpClient ın farklı formatlardaki yazdırma fonksiyonları ile sunucuya komut gönderilmiş olur. Sunucu ise IdTCPServer ın uygun formattaki okuma fonksiyonları ile gönderilen bilgiyi okur.Ve sunucu, gerekliyse doğrulama amaçlı, yeni bir mesaj gönderir. Bu da kullanıcı tarafından okunur. Ve böylece veri alışverişi güvenli bir şekilde gerçekleşmiş olur.



Örnek bir iletişim şu şekilde olabilir:



i.  Kullanıcı, sunucuya talepte bulunur:     



[code]IdTCPClient.WriteLn('Yazdırma İsteği');



ii. Sunucu, kullanıcıdan gelen isteği okur:


gelenistek:=Kanal.Connection.ReadLn;



iii. Okunan komuta bağlı olarak program içinde gerekli işlemler yapılır.

iv. İşlemlerin yapıldığı kullanıcıya bildirilir:


Kanal.Connection.WriteLn('İşlem Tamam.');



v. Kullanıcı işlem sonucunu okur ve böylece doğrulama tamamlanmış olur:


IdTCPClient.ReadLn;



Kullanıcı istek göndermeyi formun OnShow olayı,buton tıklaması gibi bir olayla başlatabilir. Sunucuda bu işlemler IdTCPServer ın OnExeceute olayında gerçekleştirilir.

Kodlaması aşağıdaki gibi olabilir:


procedure TMainFormServer.TCPServerExecute(Kanal: TIdPeerThread);

var

 Client: Kullanıcı;

 IstekTalebi: string;

 begin



 if not Kanal.Terminated and Kanal.Connection.Connected then

    begin

    Client := Kullanici(Kanal.Data);

    IstekTalebi := Kanal.Connection.ReadLn;



          if  IstekTalebi = 'Yazdırma İsteği'  then

          begin

           ...

           end;

    Kanal.Connection.WriteLn('İşlem Tamam.');

    end;

end;



Bağlantının sonlandırılması ile ilgili kodlamalar da, genellikle formun OnClose olayında belirtilir.
Buradaki kodlamalar aşağıdaki gibi olabilir:

Sunucu Tarafı:


IdTCPServer.Active:=False;

KullaniciListesi.Free;

Kullanıcı Tarafı:

IdTCPClient.Disconnect;






- about.delphi.com sitesindeki notlardan yararlanılmıştır.
  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

ben salakmıyım yhaw:( hiç bisiy anlayamıyorum :(
hocam eline sağlık
Hocam peki aynı makinede 2 adet istemci çalışırsa, ve bu istemcilerden 1i (IRC Örnek alınırsa) #a kanalında, diğeri #b kanalında ve 3. bir sunucudaki kişi #a kanalına birşey yazdığında 1. istemcimize veri iletiliyor, 2. ye iletilmesini nasıl önleyeceğiz? Çünkü o #a kanalında değil, #b kanalında bulunuyor. bunu ayırt edebileceğimiz bir sistem nasıl yaratabiliriz?
hımm delphi mantıgı walla dogrusu biraz karısık ama guzel kurcalamak guzel :) elinize saglık..
Teşekkürler
Sayın Site Yöneticisi veya konuya hakim Delphi proğramcısı arkadaşlarım... Delphi 2005 veya Delphi Indy ile PC kartları ile uydudan gelecek dijital yayınları izleyebileceğim ProgDVB benzeri bir proğram geliştirmek istiyorum. Bu konuda Türkçe kaynak gösterebilirmisiniz. Lütfen İnternetde ara demeyin zira 1 aydır arıyorum neticeye kıyısından bile ulaşamadım. Mustafa

Yukarı Git