Tweet

Ana Sayfa   Forum   C#.NET
Yeni Başlık Cevap Ekle
white_bullet Network Programlama (19/03/2009 08:25)
profil Oguzz
 offline OFFLINE
 Senior Coder

Öncelikle herkeze merhaba diyerek söze başlayalım..

C# ile son zamanların şüphesiz en popüler ve merak edilen konularından biri olan socket programlama konusuna dilim döndüğü kadar değineceğim.Daha öncede benzer olarak c ile örnek bir telnet tabanlı socket sunucu anlatımı yapmıştım.Hemen hemen mantık benzerdir.
Şimdi biz bunu c# ile daha dinamik bir mimariye giydirelim.İlk olarak sınıfları incelemekle başlayalım..Bilindiği üzere c# nesneye dayalı programlama dillerinden biridir.Doğal olarak iletişimin nesnelerr üzerinden yürütülmesi karşılaşılacak mantıksSystem.IOal bir doğrudur.Seviye olarak bir çok arkadaşımız bilir c# ayrıntılardan refaha ermemizi sağlamıştır.Bu yüzdendirki sanırım ben daha çok socket programlama eğiliminde bulunanların c# nesne yönelimli programlama dilini seçtiğini görmekteyim..Öncelikle c# ile network programla diğer dillere nazaran daha basit bir yapıdadır.Yavaş yavaş konunun aslına yönelelim şimdi;

Ağ programlamada isimalanı yani "NameSpace" buna isim uzayıda denilmektedir,System.Net.Sockets isim alanlarını kullanacağız ve bu uzayların altındaki sınıfları genellikle kullanacağız.Hemen dosyalama işlemlerinde kullanacağımız isim uzayını ve WriteLine() ReadLine() "Ki c ile verdiğim örnek sunucu anlatımında değinmiştim bu okuma ve yazma methodlarına"değindikten sonra bu methodlarda dosyadan data okuma yerine ağdan veri okuma ve yazdırma işlemlerini yapacağımızı hatırlatmak istiyorum.İsterseniz şimdi yavaş yavaş kullanacağımız sınıf kavramlarına giriş yapalım;

SOCKET CLASS

Az çok socket programlama mantığını kapmış biri gerçekleştirilen iletişimin socket lere bağlı olduğunu ve socketler üzerinden yapıldığını bilebilir.Şimdi bu sınıftan bir bildirim nesnesi meydana getirelim.


CODE:

Socket nesnemiz=new Socket(AdressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
Hemen açıklayalım bu parametreler ne işe yarar?

AdressFamily=Adresleme türü
SocketType=Socket tipi/türü daha çok taban olarak ne kullandığını belirtir.Örneğin byte veya mesaj
ProtocolType=Protokol türünü ifade etmektedir

Şimdi değinmek istediğim diğer bir sınıf var özellikle sunucu tarafını kolaylaştıran TCPListener sınıfı..

TCPLİSTENER CLASS

Yine yukarıdaki sınıfta verdiğimiz örnek gibi bildirim meydana getirelim..Bu bildirim listener sınıfını kullanarak dinleme nesnesi yaratsın..


CODE:
TCPListener TCPDinleyen=new TCPListener(3500);

Bu listener sınıfına 3 yapılandırıcı kurmak mümkün.Bu yapılandırıcılar dinleme nesnesidir.Hemen onlarıda sıralayalım..

IPEndPoint
IP adres,Port numarasını geçerek
Yalnız Port numarası ile çağırma
IPEndPoint sınıfı kullanıp ip ve port numarası barındıran bilgileri kullanarak çağırma


Şimdide start() methodunu kullanalım.Dinleme nesnesi oluşturulmuşsa nesneyi dinlemek için mevcut start methodunu kullanırız.Basit haliyle özetlersek;

CODE:
public void Start();


Bu method parametre almadı dikkat ederseniz.Bir bildirim yapalım bu methoda..

CODE:
TCPDinleyen.Start();


Socket uyumunun sağlandığı noktada gelen bağlantıların kabul edilmesi aşaması boy gösterecektir.Bu durumda AcceptSocket() methoduna başvuracağız.

Özetleyelim yine;


CODE:
Socket HaberSoket=TCPDinleyen.AcceptSocket();

İstersek eğer socket bağlandı veya bağlanmadı bunun kontrolünüde yine Connected() bool türünden geri dönüş değeri sağlayan methodu kullanabiliriz.

Biraz daha ilerleyelim ve Client konusuna gelelim.Burada karşımıza çıkan sınıf ise;

TCPCLIENT CLASS

Diyelimki bir sunucumuz var.Ve bu sunucuya bağlanmak istiyoruz.İstemci taraflı bir sınıfımız olan TCPClient sınıfı burada imdadımıza yetişiyor.Ve bağlantının ne kadar kolay gerçekleştiğine tanık olacağız hep birlikte..

CODE:
TCPClient HaberSocket=new TcpClient("localhost",3500);


Şimdi buraya kadar herşey güzel.Ancak veri alışverişlerinde bazı bilgiler kullanılacaktır.Bunları NetworkStream sınıfına aktarmamız gerekiyor.Onuda yapalım hemen;


CODE:
NetworkStream Agtrafic=HaberSocket.GetStream();

Biraz NetworkStream Sınıfından bahsedelim..

NetworkStream(az önce yukarıdada örneğini yaptığımız kullanım mantığı)kendisine gönderilen socket nesnesine ait dataları yine kendi sınıfının türünden bir nesnede tutar.
Bu ne işimize yarar dersek en basitinden c# dilinin bizi bazı ince detaylardan kolaylıkla kurtardığını söylemiştik.Burada kanıtlıyor bunu.Bu sınıfa kaydedilen bilgileri kullanmak istediğimiz zaman System.IO uzayında mevcut olan StreamReader ve StreamWriter sınıfları ile okuruz

Örnek vererek anlatalım;


CODE:
NetworkStream Agtrafic=HaberSocket.GetStream();
Stream Agoku=new StreamReader(Agtrafic);
StreamWriter Agayaz=new StreamWriter(Agtrafic);


Genel olarak c# nesne yönelimli programlama dili ile socket programlamaya bir giriş yaptık.Sınıfları ve kullanımlarını gördük.Kullanım alanlarına değindik.Bağlantıların nasıl yapılacağını,gelen bağlantıları kabul etme aşamasını,ağ hareketlerini izlemeyi ve hareketlerin ağdan okunmasını öğrendik..Şimdilik burada noktalıyorum.Bu yazıyla birlikte daha sık remote connection olaylarıyla ve bu tarz soket yapılarına değineceğiz..

Kolay gelsin.

just code it!

Üye Profili

white_bullet Re:Network Programlama (30/06/2010 06:51)
profil ilkaysener
 offline OFFLINE
 New Coder

İyi güzel ancak birden fazla Client bağlamak için BeginAcceptSocket kullanımını da gösterirmisiniz ??

profil

white_bullet Re:Network Programlama (01/07/2010 18:07)
profil Oguzz
 offline OFFLINE
 Senior Coder

link

just code it!

profil
 
1 /
 
Ana Sayfa   Forum   C#.NET
Yeni Başlık Cevap Ekle
 

MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg