Makale Özeti

HTTP, FTP ve SMTP protokolleri ile çalışan GUI uygulamalari geliştirmek için o protokollerin komutlarını bilmeniz yeterlidir. Genelde her şey aynıdır GET, POST ve SEND gibi kolay komutlarla o protokolu kullanabilirsiniz. Burada tek dikkat edilmesi gereken konu client ve serverin ayni dili konusuyor olmalarıdır. Bu makalede inceleyecigimiz konu bunların altında çalışan başka protokoller ve bu daha derin seviyelerde iletişim kurmanın yapısını inceleyeceginiz.

Makale

TCP ile basit bir Client&Server uygulaması

        İki makina arasında iletişim kurarken binary veri paketleri gönderip almaktayız. Bu küçük uygulamayı yaparken  bize yardımcı olacak .NET namespacemiz ise
System.Net.Socketsdir. Bu namespacedeki bazı classlar sayesinde direkt olarak TCP paketleri yollayabilir veya bize gelen paketleri belli bir porttan dinleyebiliriz. Internet uzerinde akan paketlerin çogunlugunu TCP oluşturur.

        TCP yi kulanırken dikkat etmemiz gereken nokta hangi portu kullanacagımızı seçmektir, portlar  IANA(The Internet Assigned Number Authority) tarafından standartlaştırılıp atanmıştır. TCP yi seçmemizin nedeni ise paketlerin iletilmesini garanti etmesi, hata düzeltmesi ve buffering yapmasidir. Ben ilk olarak paketleri dinleyip alacak olan serveri gösterecegim.

        Yandaki Form, yanlizca multirow bir textboxdan oluşmaktadir. Ve tek yapacagimız işlem ise belirledigimiz porttan verileri okumak ve bunu textboxa aktarmak. Dinle isimli bir fonksiyonumuz var.

public void Dinle()
{
//1472 portunu dinliyoruz
TcpListener tcpListener = new TcpListener(1472);
tcpListener.Start();

//socket yerine TcpClient ile işi kolaylaştırıyoruz

TcpClient tcpClient = tcpListener.AcceptTcpClient();
//stream'a aliyorz geleni
NetworkStream ns = tcpClient.GetStream();
StreamReader sr = new StreamReader(ns);
//string objesini çok seviyorum
string okunan = sr.ReadToEnd();
//cagıralim
Invoke(new EkranaDelegate(Ekrana),new object[] {okunan} );
tcpClient.Close();
tcpListener.Stop();
}

        TcpClient ile çeşitli parametreleri belirleyebiliyoruz bunlar makinaya uzaktan gelen TCP paketlerini nasıl tutacagımızla ilgili, bunlar timeout süreleri, buffer boyutları olabilir. TcpListener classını, Start yaptıgımız anda bize gelen TCP paketlerini dinliyor olucaz.

        Bu aşamadan sonra ya AcceptSocket methodu ile bize uzaktaki istegi yapan makina ile bir baglanti socketi acabiliriz yada AcceptTcpClient() ile TcpClient objesinin nimetlerinden faydalanabiliriz. Kesinlikle TcpListener ve TcpClient nesnelerini kullanmak çok daha kolay ve kullanışlı, ben onlari kullandim.

        Burada yapmamiz gereken fonksiyonumuz çalişirken programimizin donmasini(beklemesini) saglamak, yani TcpListener calışırken gider işlemlere programlarımızın cevap vermesini saglıcaz. Bunun için arkaplanda çalışan klasik bir thread oluşturucaz.

System.Threading uzayismini eklemeyi unutmadan şunları Form'un constractor'una yazınız:

Thread islem = new Thread(new ThreadStart(Dinle));
islem.Start();


        Diger önemli fonksiyonumuz ise ekrana gösterme işlemini yapıcak.

public void Ekrana(string gelenler)
{
textBox1.Text = gelenler;
}
//Temsilcimiz tanımlanıyor. Geri dönüş değeri olmayan ve parametre olarak gelen msj i alan metodları temsil ediyor.
protected delegate void EkranaDelegate(string gelenler);


        Backgrounda çalışan thread ile direkt textbox'a erişmemek için bir delegate ile Form'un Invoke methodunu kullandık. TCP portundan okunanları object array'ine parametre olarak geçtik ve form'da TextBox'a aktardik. StreamReader ile agdan gelen bilgileri bir string haline dönüştürmüştük daha önce.

        Şimdi sıra TCP ile belirtigimiz IP ve porta veri yollayacak bir server yapmakta. Formu ben böyle tasarladım;
        İlk textboxumuz hedef yani msjin iletilecegi makinanın IP si veya makina ismini yaziyoruz, bu makinada Server programımızın mutlaka çalışıyor olması lazım. Çünkü TCP baglantısı kurulmadan msjin yollanmasını istemiyoruz.

            Localhost'dan kastımız burada 127.0.0.1 yani kendi makinamız. Buraya IP mizide yazabiliriz mesela 192.168.1.18 gibi. Msj yollayacagımız makina ile aynı agda olabilecegimiz gibi internet uzerindeki her hangi bir gerçek IPye sahip bir makinada olabilir. Portumuzu ben serverinkinide 1472 olarak ayarladıgım için 1472 sectim. Portu dikkatli secmek lazım, iyi bilinen port numaralarını seçmemeye bakınız, mesela 21, 80 gibi.

        Gönder butonumuz şu işi yapmaktadır;

private void btn_yolla_Click(object sender, System.EventArgs e)
{
    try
    {
    //yine bi client oluşturuyoruz
    TcpClient tc = new TcpClient(txt_host.Text, Convert.ToInt16(txt_port.Text));
    //bir network stream yaratıyoruz
    NetworkStream ns = tc.GetStream();
    //msjimizn karakterlerini byte e ceviriyourz ve networkden yollana bilecek hale getiriyoruz
    for(int i=0;i<=txt_mesaj.Text.Length-1;++i)
        {
        //yolluyourzzzz
        ns.WriteByte((byte)txt_mesaj.Text[i]);
        }
    //baglantıyı kesiyoruz
    ns.Close();
    tc.Close();

    //iletildigini haber veriyoruz

    MessageBox.Show(txt_host.Text+" makınasına msjınız iletildi.","Msj Yollandı");
    }
    catch(Exception)
    {
    //hata msjı herşeyi anlatı bence :)
    MessageBox.Show(txt_host.Text+" makinada TCP Server programi çalışmıyor veya baglantınızda bir sorun var.","Sorun var");
}
}


        Eger msjımız iletilebiliyorsa dinleyen server makinasının textboxuna düşecektir. TCP ile byte degerinde veriler yollamak ve almak bu kadar basit.

        Geldik bir makalemizin daha sonuna. Hepinize iyi çalışmalar ve mutlu günler dilerim. Umarım faydalı olur...