Makale Özeti

Bu makalemde sizlerle Tcp protokolünün nasıl kullanıldığını bu protokolü kullanan bir mesajlaşma programı yazarak inceleyeceğiz. Programda clientlar sadece programın açılmasında sunucya giderek kullanıcı bilgilerinin saklanmakta olan XML dosyasını kendilerine kopyalayacak, dosyaya ulaşamadığı anda ise lokaldeki kopyasından disconnected olarak çalışabilecektir. Bunun yanı sıra clientlar kendi aralarında mesajlaşmada, online ve offline bilgilerini göndermede direkt haberleşecek ve sunucya yük bindirmeyeceklerdir.

Makale

          Makalemizin bu ikinci kısmında ilk önce MessengerBase isimli temel işlemlerin yapılacağı Classımızı yazacağız ardından ise kullanıcıların mesajlaşacağı Mesajlaşma formunu yazacağız.

          MessengerBase isimli class'ımızı yazmaya başlayalım

 
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Windows.Forms;
 
namespace Messenger
{
    public class MessengerBase
    {
       
        public enum MessageType
        {
            Login,
            Logoff,
            Message,
        }
        public static Form mainForm;
        public static TreeView trv;
        public static Thread threadRecieve;
        public static TcpListener tcpListener = new TcpListener(int.Parse(System.Configuration.ConfigurationManager.AppSettings["port"]));
          MessengerBase class'ımızda biraz önce bahsettiğimiz MessageType enumeration'unu tanımlıyoruz ve Form cinsinden mainForm isimli public static bir değişken tanımlıyoruz, daha sonrasında ise TreeView cinsinden trv isimli public static bir değişken tanımlıyoruz. Daha sonrasında ise threadRecieve  isimli bir Thread tanımlıyoruz, ve app.config'de belirttiğimiz portu dinleyecek bir tcpListener tanımlıyoruz. Bunların hepsi heryerden ulaşacağımız static değişkenlerdir.
 
 
        public static void StartListening()
        {
            MessengerBase.threadRecieve = new Thread(new ThreadStart(RecieveMessage));
            MessengerBase.threadRecieve.Start();
        }
          StartListening metodunda Threadimizin Recievemessage isimli metodu çalıştıracağını belirtiyoruz ve threadimizi başlatıyoruz.
 
 
        public static void RecieveMessage()
        {
            Socket soTcp;
            try
            {
                while (true)
                {
                    tcpListener.Start();
                    soTcp = tcpListener.AcceptSocket();
 
                    byte[] received = new byte[1024];
                   
                    int bytesReceived = soTcp.Receive(received);
                    String dataReceived = System.Text.Encoding.ASCII.GetString(received);
                    Message messRecieved = new Message();
                    messRecieved.DeSerialize(dataReceived);
                    if (messRecieved.Type == MessageType.Login)
                    {
                        ((frmMain)mainForm).SetUserOnline(messRecieved.Sender);
                    }
                    else if (messRecieved.Type == MessageType.Logoff)
                    {
                        ((frmMain)mainForm).SetUserOffline(messRecieved.Sender);
                    }
                    else if (messRecieved.Type == MessageType.Message)
                    {
                        ((frmMain)mainForm).SetMessage(messRecieved);
                    }
                    tcpListener.Stop();
                }
            }
            catch (Exception)
            {
                tcpListener.Stop();
            }
           
        }
       
    }
}
          RecieveMessage metodu ise thread'imiz içinde çalışacak olan metoddur. Bu metodumuzda ilk önce bir Socket tanımlıyoruz ve TcpListener'imizi başlatıyoruz. Gelen byteları Socket'imiz içinde bulunan Recieve metodu ile dolduruyoruz ve daha sonrasında DeSerialize metodu ile Message nesnemizi oluşturuyoruz. Message nesnemizde bulunan type propertysinin değerine göre frmMain isimli programımızın ana formunun üzerinde bulunan metodları çalıştırıyoruz. Daha sonrasınde ise tcpListener nesnemizin Stop metodunu çağırıyoruz.

         Şimdi ise Mesajlaşmanın yapılacağı ekran olan frmMessaging formunu oluşturalım.


 
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace Messenger
{
    public partial class frmMessaging : Form
    {
        public frmMessaging()
        {
            InitializeComponent();
        }
 
        private void frmMessaging_FormClosed(object sender, FormClosedEventArgs e)
        {
            frmMain.frms.Remove(this);
        }
          Formumuz kapatıldığı zaman frmMain isimli metodunda bulunan frms isimli açık mesajlaşma pencerelerinin tutulduğu static generic olarak Form nesnesi belirtilmiş List tipinden değişkenden mevcut formu çıkarıyoruz.
 
 
        private void btnGonder_Click(object sender, EventArgs e)
        {
            try
            {
                Message msg = new Message();
                msg.Type = MessengerBase.MessageType.Message;
                msg.Text = txtGonderilecekMesaj.Text;
                msg.Reciever = new Client(this.Text, this.Tag.ToString());
 
                txtMesaj.Text += msg.Sender.Name + " : " + msg.Text + "\r\n";
                msg.Send();
                txtGonderilecekMesaj.Text = "";
               
            }
            catch (Exception)
            {
                txtMesaj.Text += "Mesaj Yerine Ulastirilamadi\r\n";
            }          
        }
        public void RecieveMessage(Message msg)
        {
                txtMesaj.Text += msg.Sender.Name + " : " + msg.Text + "\r\n";
        }
          Gönder butonuna tıklandığı zaman mesaj pencerenin sahibi olan kullanıcıya gönderilecektir. Bunun için butonun click olayında ilk önce bir Message nesnesini oluşturuyoruz ve propertylerine değerler atıyoruz. Burada önemli bir nokta ise mesajın gideceği kullanıcı bilgilerinin formun Text ve Tag propertysinde saklanıyor olmasıdır. Message nesnesini oluşturduktan sonra nesnemizin send metodunu çağırıyoruz. RecieveMessage metodunda ise gelen message nesnesindeki Text değişkenini alıyoruz ve bunu kullanıcıların göreceği TextBox'a yansıtıyoruz.
 
 
        public void DisableControls()
        {
            txtGonderilecekMesaj.Enabled = false;
            btnGonder.Enabled = false;
        }
        public void EnableControls()
        {
            txtGonderilecekMesaj.Enabled = true;
            btnGonder.Enabled = true;
        }
    }
}
          DisableControls ve EnableControls metodlarında ise Kullanıcının Offline olması durumunda o kullanıcıya mesaj atılamaması için tüm kontrollerin disable olması ve kullanıcı tekrar online olduğunda bu kontrollerin tekrar enable olması için gerekli metodlardır.

         Makalemizin üçüncü kısmında ise programımızın esas formu olan frmMain isimli formu kodlayacağız.

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com
Ornek Uygulama