Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

.NET Socketler ve Client-Server arasında iletişimi anlamak.

Merhabalar arkadaşlar,
Bu makalemizde basit olarak bir portu dinleyen bir server uygulaması ve bu porta mesaj yollayan bir client uygulamasını nasıl yapabileceğimizi inceliyor olacağız. Öncelikle soket programlamaya neden ihtiyaç duyarız ondan başlamanın faydalı olacağını düşünüyorum. Öncelikle soketleri makinalar arası iletişimin sağlanması için bir iletişim kanalı gibi düşünebiliriz. Soket uygulamalarında mesajları dinleyen ve uygun cevapları dönen bir server tarafı ve servera istekte bulunan ve cevap bekleyen bir client tarafı vardır. Arasındaki iletişim komplex bir yapı olmakla birlikte .NET bize bunu çok kolay hale getirmektedir. Ayrıca bu client-server iletişimini senkron veya asenkron olarak ihtiyacımıza göre modelleyebiliriz.

Client ve Server arasındaki iletişim için TCP\IP ve UDP protokollerini kullanabiliriz. TCP de server belirli bir portu dinler ve istekleri karşılar. Client ise aynı porta isteklerini yollar. UDP de ise veri tek bir soket üzerinden birden çok alıcıya iletilebilir.Biz örneğimizde basit olarak TCP protokolünü kullanacağız.

Kendi çalıştığım bankada da dış sistemlerle entegrasyon noktasında bu tür programlama teknikleri kullanılmakta. Örneğin kredi kartları entegrasyonu noktasında dış firmalardan gelen istekleri TCP protokolü ile dinleyen bir exe , gelen byte verilerini parse edip veritabanlarına uygun şekilde kayıt işlemlerini yapmakta. Bunun gibi daha bir çok örnek vermek mümkün.

Lafı daha fazla uzatmadan örneğimize geçelim…

SERVER UYGULAMASI

try{

<em id="__mceDel"> IPAddress IP = IPAddress.Parse("localhost");
System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(IP, 3455);
listener.Start();
Byte[] bytes = new Byte[1024];
String data = null;</em>

while (true)
{
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("Bağlantı Sağlandı...");
NetworkStream stream = client.GetStream();

int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
Console.WriteLine("Data alındı : {0}", data);

data = data.ToLower();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

Console.WriteLine("Data değiştirilip gönderildi : {0}", data);
stream.Write(msg, 0, msg.Length);
}
client.Close();
}
}
catch (SocketException ex)
{
Console.WriteLine("SocketException: {0}", ex.Message);
}
finally
{
Console.Read();
}

CLIENT UYGULAMASI

TcpClient client;
NetworkStream stream;
StreamReader streamReader;
StreamWriter streamWriter;
try
{
client = new TcpClient("localhost", 3455);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
//Server programında yaptıklarımızı burda da yapıyoruz.
stream = client.GetStream();
streamReader = new StreamReader(stream);
streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("Client mesaj gönderdi.");
streamWriter.Flush();
string received = streamReader.ReadLine();
MessageBox.Show(received, "Server Mesaj Gönderdi.");

Son olarak sıkça karşılaşılan Socket Exception’lardan 2sine göz atalım.

Eğer dinlemeye çalıştığınız portu dinleyen başka bir yazılım o bilgisayarda mevcut ise aşağıdaki hata ile karşılaşırsınız.
An attempt was made to access a socket in a way forbidden by its access permissions.
Erişim izinlerince izin verilmeyen bir şekilde bir yuvaya erişilmeye çalışıldı.

Eğer bilgisayarınızda bir virüs programı veya güvenlik duvarı port erişimlerini engelliyorsa aşağıdaki hatalar ile karşılaşırsınız:
TCP error code 10061: No connection could be made because the target machine actively refused it.
[System.Net.Sockets.SocketException] = {“Hedef makine etkin olarak reddettiğinden bağlantı kurulamadı 127.0.0.1:5555”}

Umarım faydalı olmuştur.

Reklamlar

Şubat 9, 2013 Posted by | C#, Yazılım | , , , , | 3 Yorum

Bir yazılımcıda olması gereken 10 özellik

Önümüzdeki 5 yıl içerisinde yazılımcıların ceplerinde bulundurmaları gereken 10 özellik aşağıdaki gibi sıralanmış. Ben de kısaca özetlemek istedim.

1- 3 büyük programlama dilinden birini mutlaka bilmeli. (.NET,Java,PHP)
2- Sevin veya sevmeyin mutlaka Rich Internet Applications (RIA) yapabiliyor olmak şart. Flash,Silverlight,HTML5,AJAX gibi görselliği ön plana çıkartabileceğimiz teknolojileri öğrenmekte fayda var.
3-Web Development :   popüleritesini yitirmeyecek JavaScript, CSS, and HTML gibi diller önemini koruyacak
4-Web Service : REST veya SOAP, JSON veya XML. Artık web servisler developerların sürekli ihtiyaç duydukları teknolojiler.
5-Soft Skills : Müşteriler ve diğer çalışanlar ile iletişimlerini kuvvetlendirmeli ve insanları etkilemeyi öğrenmeli.
6-Ruby, Python, F#,  Groovy gibi fonksiyonel programlama dillerinden bir tanesini öğrenmeli, çünkü bu diller bazı sektörlerde kilit rol oynayabiliyor.
7-Çevik Metodolojiler : Proje yönetim metodolojilerine uzak kalmamak , özellikle de popüler çevik yöntemler hakkında bilgi sahibi olmak gerekiyor.
8-Visual Studio Team System gibi araçları etkin kullanarak takım halinde sağlıklı yazılım geliştirme yapmak amaç edinilmeli.
9-Mobile Development : Önümüzdeki yıllarda mobil programcılara olan ihtiyaç artacak ve yazılımcılar buna şimdiden adapte olmak için Android,IOS gibi işletim sistemlerinde kod yazmaya aşina olmalı.
10-Domain Bilgisi :Çevik metodolojiler ile birlikte geliştirme ekibi projenin tanımında söz sahibi olmaya başladı. Yazılımcılarda domain bilgisini yüksek tutup projeye değer katacak fikirler sunabilir hale gelmeli.

http://www.techrepublic.com/blog/10things/10-skills-developers-will-need-in-the-next-five-years/643

Şubat 6, 2013 Posted by | Yazılım | | 1 Yorum