• Web sitemizin içeriğine ve tüm hizmetlerimize erişim sağlamak için Web sitemize kayıt olmalı ya da giriş yapmalısınız. Web sitemize üye olmak tamamen ücretsizdir.
  • Sohbetokey.com ile canlı okey oynamaya ne dersin? Hem sohbet et, hem mobil okey oyna!
  • Soru mu? Sorun mu? ''Bir Sorum Var?'' sistemimiz aktiftir. Paylaşın beraber çözüm üretelim.

Delphi Indy bileşenkeri ile ağ programlaması

Üyelik Tarihi
7 Ocak 2015
Konular
4,091
Mesajlar
4,274
MFC Puanı
40
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.

Kod:
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:

Kod:
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:

Kod:
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: 

Kod:
IdTCPClient.WriteLn('Yazdırma İsteği');
ii. Sunucu, kullanıcıdan gelen isteği okur: 

Kod:
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: 

Kod:
Kanal.Connection.WriteLn('İşlem Tamam.');
v. Kullanıcı işlem sonucunu okur ve böylece doğrulama tamamlanmış olur: 

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

Kod:
IdTCPServer.Active:=False;
KullaniciListesi.Free;
Kullanıcı Tarafı:
IdTCPClient.Disconnect;
 
Üst