SERVER CLIENT UYGULAMASI

C# Programlama dili ile yapılmış örnek bir server – client mesajlaşma programı. Bilgisayarlar arası haberleşme. Network uygulaması.



Bilgisayar programcılığının en zevkli uygulamaları çift taraflı haberleşme yapılabilen uygulamalardır. Ağda bulunan herhangi iki bilgisayarı birbiriyle haberleştirecek kodlar yazmak, ağdaki bilgisayarlar arasında dosya vb. doküman paylaşımı ve sohbet yapılmasını sağlayan kodlar yazmak bir programcıyı asla sıkmayan bir iştir. Ancak en zor programlama işi de bu tip programlardır. Zorluğun sebebi ise ağdaki veri alışverişi sizin hakimiyetiniz ve kontrolünüz dışında olmaktadır. Siz kodları yazarsınız ama kodlar çalışınca veriler porta oradan da ağa gönderilir. Ağda hedef bilgisayara ulaşan veriler bu bilgisayarın portuna gelir oradan da yine program çalışıyorsa veri alınabilir. Öyleyse ağ programcılığında güvenlik önemli bir parametre olmaktadır. Yine bu tip uygulamaları yazarken her türlü ihtimali gözönünde bulundurmalı olası her türlü kırılma ve hataya karşın en üst düzeyden tedbir almalısınız.

Bütün bu durumlar gözönüne alındığında ağ programcılığının zaman, sabır ve emek işi olduğu anlaşılır. Bir uygulamanın ne kadar mükemmel çalıştığı zaman içinde belli olacaktır.


Bu yazıda ağ programcılığının ayrıntılarına girmeden basit ama bir o kadar da profesyonel diyebileceğimiz bir uygulama anlatacağım. Oldukça uzun olduğundan dolayı ve geniş bir anlatım yapmak istediğimden, uygulama iki bölümden oluşacak. 1. Bölümü bu yazıda anlatacağım server tarafı olacak. 2. Bölümünün linki sayfa altında yer alacak ve o bölümde de client tarafının kodlarını vereceğim ve çalışmasını anlatacağım.

Server kodlarını bir program, client kodlarını ise ayrı bir program yapmalısınız. Tabii isimleri de farklı olmalı. Daha sonra her iki programı da çalıştırın. DİNLE buttonlarına basarak iki programı da dinleme konumuna getirin. Burada güvenlik duvarı çalışacak ve sizden izin isteyecektir. Siz izin vermedikçe güvenlik duvarı ağda portun dinlenmesine izin vermeyecektir. Bu durumda korkmadan izin verin çünkü kodlar elinizde ve zararlı bir şey yok. Ayrıca antivirüs uygulamaları da engelleyebilir. Antivürüs programlarında da engellenen uygulamalarda izin vermelisiniz. Bu engellemeler yapılır, çünkü bilgisayarınızda basit de olsa bir program PC portunu dinlemekte, veri alışverişi yapmaktadır.

Gelelim Server tarafının uygulamasını oluşturmaya.

Öncelikle aşağıdaki gibi bir ekran tasarımı oluşturacağız. 2 adet listbox, 3 adet button ve 3 adet label, 1 adet de textbox işimizi görecektir. Yapacağımız işe gelince;

ServerClient4


Button1 e basınca bilgisayar ağı dinlemeye başlayacak ve kendisine ağdan herhangi bir mesaj gelirse anlık olarak bunu listbox1 de gösterecek. Listbox2 de ise size veri gönderen PC nin IP numarası yer alacak. Textbox1 e bir metin yazıp button3 e tıklarsanız mesajınız size mesaj gönderen PC ye iletilecektir. Label1 gönderdiğiniz mesajın karşı tarafa ulaştığını size bildirecektir.

Bunun için bir thread nesnesi oluşturuyoruz ve bu nesneye değişken olarak dinleme prosedürünü atıyoruz.

Kanalın önem derecesini normal olarak atıyoruz. Uygulamadan çıkınca donma olmaması için thread nesnesine IsBackground değişkeni atıyoruz. Normalde ayrı bir buttona kanal.Abort yazarak kanalı kapatmayı denerseniz form donacaktır.

kanal.IsBackground = true;

Yukarıdaki kod parçası formu donmadan kapatmanızı ve uygulamayı sonlandırmanızı sağlayacaktır.

  kanal = new Thread(SWT_Listen);

            kanal.Priority = ThreadPriority.Normal;

            kanal.IsBackground = true;

            kanal.Start();


Türkçe karakter sorunu Encoding.Default değeri girilerek çözülmüştür. Siz Türkçe karakter sorunu ile karşılaşırsanız diğer ASCII, UTF8, UTF32 seçeneklerini deneyebilirsiniz. Yalnız bu seçenekleri hem server hem de client taraflarında aynı yapmanız gerekir.

Diğer kodların açıklamaları kodların karşısına yazılmıştır.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace ServerClnt
{
    public partial class Form1 : Form
    {
        public const int portno = 28015; //Dinlenecek port numarası
        public Thread kanal;
        public Form1()
        {
            InitializeComponent();

        }
        delegate void STD(string datax); //delege tanımlaması
        public int i = 1;
        Socket socket1;
        public void SWT_Listen()
        {
            TcpListener tcplisten = new TcpListener(portno); //Tcp dinleme nesnesi tanımlama
            try
            {
                while (true)
                {
                    tcplisten.Start();//dinlemeye başla
                    socket1 = tcplisten.AcceptSocket();//dinlenen portu socket nesnesine bağla
                    Byte[] okunan = new Byte[1024];
                    int boyut = socket1.Receive(okunan, okunan.Length, 0);//socket deki değeri al ve bayt dizisine geçir
                    string dataokunan = System.Text.Encoding.Default.GetString(okunan);//alınan değeri stringe geçir, dil ayarını yap

                    String gidenveri = "SERVER: Mesajınız Alınmıştır"; //karşı tarafa bir alındı mesajı hazırla
                    Byte[] gidenbyte = System.Text.Encoding.Default.GetBytes(gidenveri.ToCharArray());//alındı mesajını bayt dizisine aktar
                    socket1.Send(gidenbyte, gidenbyte.Length, 0);//socket nesnesi ile alındı mesajını yolla
                    i++;//kaç mesaj geldiğini say
                    Kanalproxsy(dataokunan);//delege kontrolüne gönder ki listboxa geçirsin
                    Kanalproxsy2(socket1.RemoteEndPoint.ToString());//2. delege yordamı da listbox2 ye IP numarasını yazsın
                    
                }
            }
            catch (SocketException ec)
            {
                MessageBox.Show("TCP Dinleme Hatası");//Hata olursa bildir
            }
        }
        private void Kanalproxsy(string veri)
        {
            if (this.listBox1.InvokeRequired)
            {
                STD delx = new STD(Kanalproxsy);
                this.listBox1.Invoke(delx, new object[] { veri });
            }
            else
            {
                listBox1.Items.Add(veri);
                listBox1.Update();
            }
        }
        private void Kanalproxsy2(string dtx)
        {
            if (this.listBox2.InvokeRequired)
            {
                STD dlg = new STD(Kanalproxsy2);
                this.listBox2.Invoke(dlg, new object[] { dtx });
            }
            else
            {
                listBox2.Items.Add(dtx);
                listBox2.Update();
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "DINLE";
            button2.Text = "TEMİZLE";
            button3.Text = "MESAJ GONDER";
            textBox1.BorderStyle = BorderStyle.FixedSingle;
            label2.Text = "GELEN MESAJ";
            label3.Text = "GÖNDEREN IP";
            this.Text = " SERVER";
        }
        private void button1_Click(object sender, EventArgs e)
        {
            kanal = new Thread(SWT_Listen); //Bir thread nesnesi yarat. Nesnenin değişkeni tcp yi dinleme prosedürü olsun
            kanal.Priority = ThreadPriority.Normal;
            kanal.IsBackground = true;//donmaya karşı önlem
            kanal.Start();//başlat
            button1.Text = "DINLEMEDE";
            
        }


        private int kx = 1;
        TcpClient tcpcln;
        private void button3_Click(object sender, EventArgs e)
        {
            
            try
            {
                tcpcln = new TcpClient("127.0.0.1", 38000); //veri gönderebilmek ve okuyabilmek için bir sınıf yarat. Alıcının IP numarasını ve dinlediği port numarasını yaz
            
                NetworkStream netws = tcpcln.GetStream(); //networkstream nesnesi yarat
                if (netws.CanWrite)//yazım modunda ise
                {
                    Byte[] giden = Encoding.Default.GetBytes("SERVER >> " + textBox1.Text);//text boxtaki yazıyı bayt dizisine çevir
                    netws.Write(giden, 0, giden.Length);//gönder
                    Kanalproxsy("SERVER >> " + textBox1.Text);//karşıya giden mesaj da listbox1 de yer alsın
                    Kanalproxsy2("Local IP");//IP numarası yereldir. Alındı mesajı ile karışmaması için lokal yazıldı
                }
                else
                {
                    tcpcln.Close();
                    return;
                }
                if (netws.CanRead)//Okuma modunda ise karşı tarafın alındı mesajını labele yaz
                {
                    byte[] oku = new byte[tcpcln.ReceiveBufferSize];
                    netws.Read(oku, 0, (int)tcpcln.ReceiveBufferSize);
                    string gelen = Encoding.Default.GetString(oku);
                    tcpcln.Close();
                    label1.Text = kx + " " + gelen;
                }
                else
                {
                    tcpcln.Close();
                    return;
                }
                kx++;//Karşı tarafa iletilen mesaj sayısı
            }
            catch
            {
                MessageBox.Show("Veri Gönderim Hatası");
                
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();//listboxu temizle
            listBox2.Items.Clear();
           
        }
      
    }
}


SERVER CLIENT-II CLIENT KODLARI


SANATSAL BİLGİ

09/08/2017

  • YORUM YAZ
  • ADI SOYADI(veya nick)
  • YORUM


  • BİLGİSAYAR - ELEKTRİK
  • YGS - LYS KONULARI
  • 8. SINIF
  • 7. SINIF
  • 6. SINIF
  • GENEL MATEMATİK
  • BİRİM ÇEVİRİCİLER
COPYRIGHT© HER HAKKI SAKLIDIR
Sitede Yer Alan Bilgi Belge Ve Materyallerin İzinsiz olarak Kopyalanması ve Alıntılanması Yasaktır

SANATSAL BILGI