Programlar Arası İletişim

Windows işletim sistemi, uygulamalar arasında iletişimi ve veri paylaşımını sağlamak için çeşitli mekanizmalara sahiptir. Bu mekanizmalara işlemler arası iletişim – Interprocess Communications (IPC) adı verilir. Tipik olarak uygulamalar IPC’yi sunucu ve istemci olarak kategorize ederek kullanırlar.

Windows’ta aşağıdaki IPC mekanizmaları mevcuttur:

  • Pano (Clipboard)
  • Bileşen Nesne Modeli (COM)
  • Veri Kopyalama (Data Copy)
  • Dinamik Veri Takası (DDE)
  • Dosya Adresleme (File Mapping)
  • İleti Yuvaları (Mailslots)
  • Borular (Pipes)
  • Uzak Yordam Çağrısı (RPC)
  • Windows Soketleri (Windows Sockets)

Ben bunların arasından otomatik veri dönüştürme ve farklı işletim sistemleri ile çalışabilme özelliğinden dolayı RPC’yi tercih ediyorum. RPC ile yüksek performanslı dağıtık uygulamalar geliştirilebilinir. RPC kütüphanesi olarak da Zyan Communication Framework‘ü tercih ediyorum.

Örnek bir sohbet uygulaması oluşturdum. Host çalıştığı anda bağlantıya başlıyor ve 3 adet farklı client çalıştırıyor. Client’lar birbirlerine mesaj gönderebiliyor.

Buradan oluşturduğum örnek projeyi indirebilirsiniz.

REST Servis Çağrısı

REST GET/POST/PUT/DELETE yapmak için uyguladığım adımlar şu şekilde:

  • Visual Studio’da Visual C#/Windows Desktop/Console Application projesi oluşturdum. Adını RestClientSample koydum.
  • NuGet üzerinden Microsoft.AspNet.WebApi.Client paketini yükledim.
  • Rest servise gönderilecek ve servisten dönecek nesnelere karşılık gelen sınıfları oluşturdum.
  • Program.cs’yi aşağıdaki gibi değiştirdim.
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace RestClientSample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                RunAsync().Wait();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }

            Console.ReadKey();
        }

        static async Task RunAsync()
        {
            using (var client = new HttpClient())
            {
                // Servis adresi
                client.BaseAddress = new Uri("http://webadresi.com/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // Servis Basic Http Authentication istiyorsa eklenir.
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(new UTF8Encoding().GetBytes(string.Format("{0}:{1}", "TestUser", "Pass"))));

                // HTTP GET
                HttpResponseMessage response = await client.GetAsync("api/IotDatas/1");
                if (response.IsSuccessStatusCode)
                {
                    IotData product = await response.Content.ReadAsAsync<IotData>();
                    Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Value, product.CreateDate);
                }

                // HTTP POST
                var iotData = new IotData { Name = "Test", Value = null, CreateDate = DateTime.Now };
                response = await client.PostAsJsonAsync("api/IotDatas", iotData);
                if (response.IsSuccessStatusCode)
                {
                    Uri gizmoUrl = response.Headers.Location;

                    // HTTP PUT
                    iotData.Value = null;
                    response = await client.PutAsJsonAsync(gizmoUrl, iotData);

                    // HTTP DELETE
                    response = await client.DeleteAsync(gizmoUrl);
                }
            }
        }
    }
}