Bu yazımızda bir Asenkron İstemci (Asyncron Client) nasıl yapılır onu göreceğz arkadaşlar. Asenkronun anlamı veri gönderimi ve alımı yaparken farklı zamanlarda uygulamanın çalışmasını sağlamak. Bu uygulama sayesinde ethernet protokolü ile veri gönderip alacağız arkadaşlar. C#’ ın soket class’ ını kullanacağız.

Aşağıdaki arayüzü C# arayüzünüzde yapın.

C# Asenkron Client Uygulaması

C# Asenkron Client Uygulaması

Daha sonra F7 ile kod sayfasına gelerek aşağıdaki kodu kendi kod sayfanıza entegre edin ve derleyrek çalıştırın.

using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace AsyncTcpClient
{
    public partial class Form1 : Form
    {
        private Socket client;
        private byte[] data = new byte[1024];
        private int size = 1024;


        public Form1()
        {
            InitializeComponent();
        }

        private void BtnBaglan_Click(object sender, EventArgs e)
        {
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(TxtIpNo.Text), Convert.ToInt32(TxtPort.Text));
            newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
        }

        private void Connected(IAsyncResult ar)
        {
            client = (Socket)ar.AsyncState;
            try
            {
                client.EndConnect(ar);
                //Invoke(new EventHandler(BaglantiDurumu));     // buda ikinci yol    

                if (TxtGelen.InvokeRequired)            // thread çakışması olduğu için başka bir fonksiyonda çalıştırmak gerekiyor.
                {
                    TxtGelen.Invoke(new MethodInvoker(delegate { TxtGelen.Text = "Connected to: " + client.RemoteEndPoint.ToString() + "\r\n"; }));
                }

                client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
            }
            catch (SocketException)
            {
                TxtGelen.Text = "Error connecting";
            }
        }

        /*
        private void BaglantiDurumu(object sender, EventArgs e)
        {
            TxtGelen.Text = "Connected to: " + client.RemoteEndPoint.ToString();
        }
        */

        private void ReceiveData(IAsyncResult ar)
        {
            try
            {           
                Socket remote = (Socket)ar.AsyncState;
                int recv = remote.EndReceive(ar);
                string stringData = Encoding.ASCII.GetString(data, 0, recv);
                //results.Items.Add(stringData);

                if (TxtGelen.InvokeRequired)            // thread çakışması olduğu için başka bir fonksiyonda çalıştırmak gerekiyor.
                {
                    TxtGelen.Invoke(new MethodInvoker(delegate { TxtGelen.Text += stringData + "\r\n"; }));
                }
                
                // tekrar okumayı başlat
                remote.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), remote);
            }
            catch (Exception)
            {
                client.Close();     // kapanırken hata çıktığı için burada kapatılıyor
            }
        }

        private void BtnKes_Click(object sender, EventArgs e)
        {
            client.Close();
            client.Dispose();
            TxtGiden.Text = "Disconnected";
        }

        private void BtnGonder_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] message = Encoding.ASCII.GetBytes(TxtGiden.Text);

                client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client);
            }
            catch (Exception hata)
            {
                TxtGelen.Text = hata.ToString();
            }
        }

        private void SendData(IAsyncResult ar)
        {
            try
            { 
                Socket remote = (Socket)ar.AsyncState;
                int sent = remote.EndSend(ar);
                remote.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), remote);
            }
            catch (Exception hata)
            {
                TxtGelen.Text = hata.ToString();
            }
        }
    }
}

Kaynak. İyi çalışmalar.


0 yorum

Bir yanıt yazın

Avatar placeholder

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.