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.

February 9, 2013 - Posted by | C#, Yazılım | , , , ,

3 Comments »

  1. Mülakat sorusu : tcp, udp arasındaki fark.

    Comment by semihkirdinli | May 24, 2013 | Reply

  2. Merhaba, Socket programlama ile bir proje gerçekleştiriyorum. Bir konuda yardımınıza ihtiyacım var. Eğer bu yeni mezun tecrübesiz meslektaşınıza yardımcı olmak isterseniz mail üzerinden ulaşabilir misiniz?

    Comment by meryem | June 18, 2013 | Reply

  3. C# üzerinde soket programlama ile yazılım geliştiriyorum. Client ve Server olmak üzere iki ayrı programım var. Bu programlar aynı ağ üzerinde haberleşebiliyor. Ancak Farklı ağlar üzerinde haberleşemiyor. Farklı ağlar üzerinde soket programlama ile haberleşmeyi nasıl yapabilirim?

    Comment by merve yıldız | November 29, 2013 | Reply


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s