Deniz Özkan | C# ile Socket Programlamaya Giriş
Yapmış olduğum bir projede uzak gösterge amacıyla kullandığım bir ekrana bilgi göndermek için kullandığım yöntemi sizlerle paylaşmak istedim. Bu doğrultuda bugün TCP protokolüyle Client/Server yapısında Socket programlamaya basit bir örnek oluşturacağız.
C#, C Sharp, Visual, Studio, Windows, form, forms, application, Server, Client, Socket, Soket, Programlama, Yazılım, win, winform, TCP, SimpleTCP, winforms, Yazılım
15560
post-template-default,single,single-post,postid-15560,single-format-standard,ajax_fade,page_not_loaded,,footer_responsive_adv,qode-theme-ver-14.2,qode-theme-bridge,disabled_footer_top,wpb-js-composer js-comp-ver-5.4.7,vc_responsive

C# ile Socket Programlamaya Giriş

C# ile Socket Programlamaya Giriş

Merhabalar,

Yapmış olduğum bir projede uzak gösterge amacıyla kullandığım bir ekrana bilgi göndermek için kullandığım yöntemi sizlerle paylaşmak istedim. Bu doğrultuda bugün TCP protokolüyle Client/Server yapısında Socket programlamaya basit bir örnek oluşturacağız.

Öncelikle çok basit bir Client uygulaması, arkasından yine çok basit bir Server uygulaması yapacağız. Kodları ve açıklamaları dikkatlice okuduğunuzda temel bilgiye sahip olacak ve hayal gücünüze göre çok daha kompleks projeleri geliştirme konusunda yeterli bilgiye sahip olacaksınız.

Artık projemize başlayalım.

Öncelikle işlemlerimizi yapabilmemiz için TCP protokolüyle çalışan servislere bağlanabilmemiz şarttır. Bunu üç fakrlı yöntemle yapabiliriz:

  1.  IPEndPoint sınıfını kullanarak IP numarası ve port numarası içeren bir bilgiyi kullanarak
  2. IP adresi ve Port numarasını vererek çağırma
  3. Sadece Port numarası ile çağırma. (Bu durumda varsayılan ağ arayüzünüz TCP servislerini sağlayacaktır.)

Biz bugün yapacağımız uygulamalarda IP adresi ve Port numarası ile bağlantımızı kuracağız.

Öncelikle Projemize SimpleTCP packetini ekliyoruz. Bu paketi, NuGet Packet Manager ekranında Browse sekmesinde arattığımızda karşımıza çıkmaktadır. Bu paketi Projemize using syntax’ını kullanarak eklediğimizde içerisindeki bütün fonksiyonları kullanabilir hale geleceğiz.

Öncelikle bağlantımızı kurabilmek için bir Baglan fonksiyonu tanımlayalım.

SimpleTcpClient Client;

bool Baglan()
{
bool BaglantiDurumu = false;
try
{
//Kullanılacak Port 8910
//Yazılım kurulduktan sonra firewall’dan gelen ve giden kurallarından ayrı ayrı 8910 portu açılmalı. Aksi takdirde engelleme yapabilir.
string IPAdres = “192.168.0.80”;
Int32 PortNo = 8910;
Client.Connect(IPAdres, PortNo);
BaglantiDurumu = true;
}
catch
{
BaglantiDurumu = false;
}
return BaglantiDurumu;
}

Bir de bu bağlantıyı Sonlandırabilmek için BaglantiyiKes fonksiyonumuz olmalı.

bool BaglantiyiKes()
{
bool BaglantiDurumu = false;

try
{
Client.Disconnect();
BaglantiDurumu = true;
}
catch
{
BaglantiDurumu = false;
}
return BaglantiDurumu;
}

Bağlantıyı açma ve kapatma fonksiyonlarımızı tanımladıktan sonra TCPClient nesnemizi formumuzun açılışında oluşturalım. Bunun için Formumuzun Load olayına gelip aşağıdaki  kodları eklememiz gerekiyor.

private void Form1_Load(object sender, EventArgs e)
{
try
{
Client = new SimpleTcpClient();   // Yeni Bir Client nesnesi oluşturuyoruz.
Client.StringEncoder = Encoding.UTF8;  //Aldığımız nesnelerin hangi formatta çözümleneceğini belirliyoruz.
Client.DataReceived += Client_DataReceived; //veri alındıktan sonra işleme girecek fonksiyonumuzu belirliyoruz.

Baglan();  // Server’ımıza bağlanıyoruz.
}
catch
{
MessageBox.Show(“Gerekli Bağlantı Kurulamadı. Lütfen Programı Tekrar Başlatın.”, “Bağlantı Kurulamadı”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Verimiz alındıktan sonra çağrılacak fonksiyonumuz yukarıda da belirttiğimiz gibi Client_DataReceived isimli fonksiyonumuz olacak. Şimdi bu fonksiyonumuzun içeriği dolduralım:

private void Client_DataReceived(object sender, SimpleTCP.Message e)
{
Mesaj.Invoke((MethodInvoker)delegate () //”Mesaj” formumuzda oluşturduğumuz bir TextBox Nesnemizin Adı
{
Mesaj.Text += e.MessageString;
});

}

Böylece TCP Protokolü üzerinden belirlediğimiz IP adresindeki makineye belirlediğimiz Port Üzerinden ulaştık ve gönderilen veriyi Client yapısı ile aldık ve formumuz üzerindeki textBox üzerinde kullanmış olduk. Burada yapmış olduğumuz bağlantıyı form load içerisinde değil de bir butonun click olayında yapmak bize testlerimizi yapmak için kolaylık sağlayabilir. Çünkü bu bağlantıyı kullanabilmemiz için önce Server üzerindeki TCP hizmetinin başlamış ve bağlantıya açık olması gerekmektedir. Sürekli açık ve çalışır vaziyette olan bir Server’ınız var ise, benim gibi load olayı içerisinde bağlantıyı sağlayıp timer içerisinde sürekli veriyi işleme yoluna gidebilirsiniz.

 

Şimdi Server yapımızı kuralım ve bunun kodlarını tamamlayalım.

Client yapımızda yaptığımız gibi SimpleTCP paketini projeye dahil edip using syntax’ı ile projemize tanıtmalıyız. Sonrasında ise,

SimpleTcpServer Server;

adında bir değişkenimizi tanımlıyoruz ki veri akışımızı bu değişken üzerinden gerçekleştirebilelim. Load olayına eklememiz gereken kodlar şunlar

private void Form1_Load(object sender, EventArgs e)
{
Server= new SimpleTcpServer();   // Yeni Bir Server nesnesi oluşturuyoruz.
Server.Delimiter = 0x13 //Enter
Server.StringEncoder = Encoding.UTF8;  //Aldığımız nesnelerin hangi formatta çözümleneceğini belirliyoruz.
Server.DataReceived += Server_DataReceived; //veri alındıktan sonra işleme girecek fonksiyonumuzu belirliyoruz.
}

Verimiz alındıktan sonra çağrılacak fonksiyonumuz yukarıda da belirttiğimiz gibi Server_DataReceived isimli fonksiyonumuz olacak. Şimdi bu fonksiyonumuzun içeriği dolduralım:

private void Server_DataReceived(object sender, SimpleTCP.Message e)
{
Mesaj.Invoke((MethodInvoker)delegate () //”Mesaj” formumuzda oluşturduğumuz bir TextBox Nesnemizin Adı
{
Mesaj.Text += e.MessageString;
e.ReplyLine(string.Format(“Gelen Veri : {0}”, e.MessageString));
});
}

Bu işlemleri yapabilmesi için Server uygulamamıza bir Client üzerinden bağlantı isteğinin gelmesi gereklidir. Uygulamamızın bu isteği beklemeye başlaması için TCP protokolünü başlatmamız gerekiyor. Bu protokolü başlatacak fonksiyonumuzu ise şu şekilde oluşturabiliriz:

void Baslat()
{
System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(txtHost.Text));
// txtHost isimli textbox üzerinde yazan metni alıyoruz. uygulama testinde, 192.168.0.81 ip numaralı makineye bağlanmaya çalıştım
Server.Start(ip, Convert.ToInt32(ip, 8910));  //8910 numaralı portu kullanıyoruz yine. İsteğinize ve gerekliliğinize göre uygun olan başka bir port da kullanabilirsiniz.
}

Bir de bu protokolü kapatmamız için bir fonksiyona ihtiyacımız var. Onu da şu şekilde oluşturabiliriz.

void Durdur()
{
if(Server.IsStarted)
Server.Stop();
}

Başlatma ve Durdurma fonksiyonlarımızı bir butonun click olayına ekleyerek kullanabiliriz. Ya da Client uygulamamızda yaptığımız gibi form load olayında çağırarak uygulamamız başlar başlamaz aktif hale getirebiliriz.

Bu uygulamalarda dikkat etmemiz gereken nokta şu, Server uygulaması TCP Protokolünü başlatmadan Client uygulaması bağlanmaya çalışırsa, bağlantı başarısız olacaktır. Ayrıca Firewall, kullanılan portu kısıtladığı için iletişim kurulamayabilir. Bunun üstesinden gelebilmek için Firewall ayarlarından bu porta müdahale edilmeli ve hem gelen hem de giden kurallar üzerinden bu porta izin verilmelidir.

Henüz yorum yok

Yorum yapmak ister misiniz?