SERVER CLIENT UYGULAMASI II

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


Bu uygulama SERVER – CLIENT uygulama yazı dizisinin 2. Bölümüdür. İlk bölümünde Server taraflı kodları yazmıştık. Bu kodlara ve açıklamasına yazı sonundaki linkten ulaşılabilir. Client uygulamasını çalıştırabilmek için server uygulamasınında yazılıp çalıştırılması gerekir. Her iki uygulama dışında port numaraları dışında fazla bir değişiklik göremeyeceksiniz. Bunun sebebi hem server kısmının hem de client kısmının çift taraflı çalışıyor olmasıdır. Yani client server e, server cliente veri yollayıp karşı taraftan veri alabilir. Uygulamayı ikiye ayırmamın sebebi tabii daha kolay anlaşılabilmesini sağlamak. Ayrıca Server programı ana makine üzerinde olabilir. Veri tabanı kaydı veya başka özel bir işlem yapılacaksa Server tarafına yazılacak ilave kodlarla bu işlem yapılabilir. Böylece sadece verileri gönderip alan kullanıcılar ile, aldığı verileri işleyen bir server programı olmuş olur. Buna ilişkin örnekleri ileride vermeyi düşünüyorum.


Uygulamaya gelince Server bölümündeki kodları bir program, client bölümündeki (bu bölüm) kodları bir program yapıyoruz, tabii her programın adı ayrı olacak. Daha sonra bu programların her ikisini de çalıştırıyoruz. DİNLE buttonlarına basarak programların ilgili portları dinlemesini sağlıyoruz. Mesaj kutusuna bir şey yazarak GÖNDER buttonuna bastığımızda metin karşı tarafa gönderilecek ve karşı tarafın gönderdiği alındı mesajı labele yazılacaktır.

Öncelikle aşağıdaki gibi bir ekran tasarımı oluşturuyoruz. 2 listbox, 1 text box 3 adet button ve 3 adet label işimizi görecektir.

ServerClient4



Button2 karşı bilgisayarı dinleme komutları içermektedir. Bu buttona tıklayınca kanal aktif hale gelir.

kanal = new Thread(Client_Listen);

            kanal.Priority = ThreadPriority.Normal;

            kanal.IsBackground = true;

            kanal.Start();

            button2.Text = "DINLEMEDE";

Oluşturduğumuz kanal nesnesine dinleme prosedürünü değişken olarak gönderiyoruz.

Kanal.Abort() yazıp bu komuta bağlı buttona tıklayınca program donmaktadır. Esasen bu donma olayı bilgisayarın kanalı kendi istediği zaman kapatmak istemesinden kaynaklanıyor. Kanal.IsBackground komutu programı kapatırken donma meydana gelmesini engeller.

Client_Listen, dinleme prosedürüdür. TcpListen nesnesi tanımlanarak port numarası değişken olarak verilmiştir. Bu port numarası client PC de bulunan ve server bilgisayarının mesajları yolladığı portun numarasıdır.

Button1_click eventine servera mesaj gönderecek kodlar yazılmıştır. Biz her iki uygulamayı da aynı bilgisayarda çalıştırdığımız için her iki programa da IP numarası olarak 127.0.0.1 değerini girdik, bu değer kendi bilgisayarınızın internetsiz IP numarasıdır. Ağ üzerinde bu uygulamayı çalıştıracak olursanız hedef makinanın IP numarasını girmelisiniz.


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

Kolay Gelsin.




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.Sockets;
using System.Net;
using System.Threading;
namespace Clientsrvr
{
    public partial class Form1 : Form
    {
        public const int portno = 38000;//Dinlenecek port numarası
        public Thread kanal;
        public Form1()
        {
            InitializeComponent();
            
        }
        delegate void clientdg(string datax);
        public int i = 1;
        TcpListener tcplisten;
        public void Client_Listen()
        {
            tcplisten = new TcpListener(portno);//Tcplistener tanımla dinlenecek port numarasını gir
            try
            {
                while (true)
                {
                    tcplisten.Start(); //dinlemeye başla
                    Socket socket1 = tcplisten.AcceptSocket();//socket nesnesini porta bağla
                    Byte[] okunan = new Byte[1024];
                    int boyut = socket1.Receive(okunan, okunan.Length, 0);//socketdeki veriyi bayt dizisine aktar
                    string dataokunan = System.Text.Encoding.Default.GetString(okunan);//bayt dizisindeki değeri stringe çevir, dil ayarını yap
                    String gidenveri = "CLIENT: Mesajınız Alınmıştır";// Karşı tarafa bir mesaj göndersin
                    Byte[] gidenbyte = System.Text.Encoding.Default.GetBytes(gidenveri.ToCharArray());//Gönderilecek mesaj bayt dizisine alınsın
                    socket1.Send(gidenbyte, gidenbyte.Length, 0);//socket veriyi göndersin
                    i++;// kaç değer geldi saysın
                    Clientproxy(dataokunan);//delege yordamlarında listboa eklensin
                    Clientproxy2(socket1.RemoteEndPoint.ToString());
                }
            }
            catch (SocketException ec)
            {
                MessageBox.Show("Veri Alımında Hata");
            }
        }
        private void Clientproxy(string veri)
        {
            if (this.listBox1.InvokeRequired)
            {
                clientdg delx = new clientdg(Clientproxy);
                this.listBox1.Invoke(delx, new object[] { veri });
            }
            else
            {
                listBox1.Items.Add(veri);
                listBox1.Update();
            }
        }
        private void Clientproxy2(string dtx)
        {
            if (this.listBox2.InvokeRequired)
            {
                clientdg dlg = new clientdg(Clientproxy2);
                this.listBox2.Invoke(dlg, new object[] { dtx });
            }
            else
            {
                listBox2.Items.Add(dtx);
                listBox2.Update();
            }
        }
        private int kx = 1;
        private void Form1_Load(object sender, EventArgs e)
        {
            button2.Text = "DINLE";
            button1.Text = "MESAJ GÖNDER";
            button3.Text = "TEMIZLE";
            label1.Text = "MESAJLAŞMA";
            label2.Text = "GÖNDEREN IP";
            label3.Text = "";
            this.Text = "CLIENT";
        }
        TcpClient tcpcln;
        private void button1_Click(object sender, EventArgs e)
        {
           
            try
            {
                TcpClient tcpcln = new TcpClient("127.0.0.1", 28015);//Tcpclient nesnesi yaratılarak veri gönderilecek PC nin Ip ve port numarası atanıyor
                NetworkStream netws = tcpcln.GetStream();//Networkstream nesnesi oluşturuluyor
                if(netws.CanWrite)//yazma modunda ise
                {
                    Byte[] giden = Encoding.Default.GetBytes("CLIENT >> "+textBox1.Text);
                    netws.Write(giden, 0, giden.Length);
                    Clientproxy("CLIENT >> " + textBox1.Text);
                    Clientproxy2("Local IP");
                }
                else
                {
                    tcpcln.Close();
                    return;
                }
                if(netws.CanRead)//okuma modunda ise karşı makinenin gönderdiği alındı mesajı labela yazılsın
                {
                    byte[] oku=new byte[tcpcln.ReceiveBufferSize];//alındı mesajının büyüklüğüne göre dizi yarat
                    netws.Read(oku, 0, (int)tcpcln.ReceiveBufferSize);//Networkstream nesnesindeki veriyi bayt dizisine aktar
                    string gelen = Encoding.Default.GetString(oku);//bayt dizisine aktarılan veriyi dil ayarlarını yaparak stringe aktar
                    tcpcln.Close();//tcpclient ile açılan portu kapat
                    label3.Text = kx.ToString() + " " + gelen;
                }
                else
                {
                    tcpcln.Close();
                    return;
                }
                kx++;
            }
            catch
            {
                MessageBox.Show("Veri Gönderme Hatası");
            }
        }
        ThreadStart listenx;
        private void button2_Click(object sender, EventArgs e)
        {
            kanal = new Thread(Client_Listen);
            kanal.Priority = ThreadPriority.Normal;
            kanal.IsBackground = true;
            kanal.Start();
            button2.Text = "DINLEMEDE";
        }
        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            listBox2.Items.Clear();
        }
   
    }
}


SERVER CLIENT -I SERVER KODLARI


SANATSAL BİLGİ

09/08/2017

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

COPYRIGHT© HER HAKKI SAKLIDIR
Sitede Yer Alan Bilgi Belge Ve Materyallerin İzinsiz olarak Kopyalanması ve Alıntılanması Yasaktır

SANATSAL BILGI