QT TCP İstemci Uygulaması (BÇOM Serisi – 3)

Evet arkadaşlar BÇOM serisine devam ediyoruz. Serideki diğer yazılara aşağıdan ulaşabilirsiniz:

En son yazımda sizlere QT ye ilişkin kısaca bilgi vermeye çalışmıştım. Yazıyı çok uzatmamak adına, açıkçası çalışan bir örnek vermedim. Eğer o yazımı okumadı iseniz, lütfen öncelikle o yazımı okuyunuz. Bu yazımda ise, sizlere QT kullanarak geliştirdiğim örnek bir uygulamayı aktaracağım. Bu vesile ile, o yazımda bahsetmediğim veya üzerinde durmadım teknik bazı konulara, QT uygulaması geliştirirken dikkat etmeniz gereken hususlara ve diğer ilgili konulara da değineceğim.

Örnek uygulama olarak, yazı dizisi ile de paralel olması adına , TCP/IP istemci uygulamasını seçtim. Bu uygulama ile QT kullanarak ağ/soket ve grafiksel kullanıcı arayüz programlamaya ilişkin de giriş yapmış olacağız ve temel kavramların nasıl uygulandığını göreceğiz. Uygulamayı, çok kabiliyete boğmadan, bu tarz bir uygulamadan beklenen asgari kabiliyetleri içerecek şekilde geliştirmeye gayret ettim. Aşağıda uygulamamıza ilişkin örnek grafiksel kullanıcı arayüzlerini görebilirsiniz:

Bu bağlamda uygulamamız:

  • Geliştirdiğimiz “NetworkLibrary” alt yapısını kullanmakta,
  • IP (ayrı bir QT bileşeni) ve port bilgileri verilen TCP/IP sunucusuna bağlanabilmekte, mesaj göndermekte ve alabilmekte,
  • ASCII ve binary veri girişine ve gönderilmesine (ayrı bir QT bileşeni olarak) olanak sağlamakta,
  • Mesaj boyutu belirleme, sonuna yeni satır ekleyebilmekte,
  • Sunucu ile olan haberleşmenin görüntülenmesi, kaydedilmesine olanak sağlamakta,
  • Kaynak kod doxygen formatına göre dokümante edilmiş durumda(Doc\Doxygen\html dizini altında).

Göreceğiniz üzere sadece incelemek için değil, aynı zaman kendi soket uygulamalarınızı doğrulamak için de kullanabilirsiniz. Yakın zamanda sunucu kısmını da geliştirip, sizleri haberdar edeceğim. Bu uygulamaya aşağıdaki adresten ulaşabilirsiniz:

https://github.com/yazilimperver/SimpleMultiplayerGameEngine

Öncelikli olarak bir önceki yazımda bahsetmiş olduğum VS QT eklentisini kurmanız gerekiyor. Kodu kendi bilgisayarınıza çekip VS 2017 kullanarak derleyip, çalıştırabilirsiniz. Burada VS 2017’nin son sürümünü kullandığınızdan emin olun lütfen, çünkü QT’nin son eklentisi eski VS 2017 sürümleri ile çalışmamakta.

Kodu çektikten sonra VS 2017 içerisinde aşağıdaki gibi hatalar alırsanız:

VS “Solution Explorer” kullanarak, ilgili solution için QT sürümü atamanız gerekmekte. Bu gerekiyor, çünkü sizlerde QT farklı dizinlerde kurulu olabilir. Bunu da yakında CMake’e taşıyacağım. Gelelim bunu nasıl yapacağınıza. Öncelikle çözüm ağacı üzerine gelip sağ tıklayacağız ve “Change Solution’s Qt Version” ı seçeceğiz:

sonrasında ise ilgili QT kurulumunu seçiyoruz ve tekrar oluşturmaya başlattığınızda, herhangi bir sıkıntı yaşamadan, tamamlanmasını bekliyorum.

Daha sonrasında aktif proje olarak “QTClientTestApp” i seçeceğiz ve “Solution platform” seçeneğini de x86 seçelim (eğer 64 bit QT kurulu ise x64 de kalabilir). Bu noktadan sonra artık VS 2017 kullanarak, projeyi derleyebiliyor olmanızı bekliyorum. Herhangi bir sıkıntı durumunda lütfen haberdar edin beni.

Şimdi gelelim projeye ilişkin sizlere aktarmak istediğim hususlara. Bunları uzun uzadıya anlatmak yerine, madde madde sizlere kısaca aktaracağım. Daha detaylı bilgi için hemen koda dalabilirsiniz:

  • VS çözümünde üç projemiz var:
    • NetworkLibrary: TCP İstemci ve Sunucu kabiliyetlerini içeren QT soket kütüphanemiz,
    • QTClientTestApp: Grafiksel kullanıcı arayüzü tabanlı, NetworkLibrary’i kullanan QT TCP istemci uygulaması,
    • QTServerTestApp: Şimdilik boş sunucu uygulaması 🙂
  • Projedeki dosyalar aşağıdaki gibi:

    • Burada ClientApp altında ana uygulamaya ilişkin kodlar,
    • IPComponent altında GKA da kullanılan ve IP girişi için kullanılan QT bileşeni,
    • MultipPurposeInputField altında GKA da kullanılan ve farklı tipte veri girilmesine olanak sağlayan QT bileşeni,
    • Resources altında ilgili resim dosyalarını içeren Resources.qrc dosyası,
    • Ve son olarak main.cpp dosyası.
  • Diğer GKA kütüphanelerinde olduğu gibi, QT de özelleşmiş görsel bileşenleri tanımlama olanağı sunmakta. Ben burada projeyi çok büyütmemek adına, farklı projeye taşımadım. Bunları da direk kopyalayarak, kendi projelerinizde kullanabilirsiniz,
  • Şimdi gelelim QT kullanılarak nasıl GKA tasarlayabileceğinize. Burada iki yöntem var. Birincisi VS ile de entegre çalışan Qt Designer kullanmak, diğer ise yazılımsal olarak bu arayüzlerin oluşturulmasıdır,
    • Ben istemci uygulaması için gördüğünüz bütün arayüzleri yazılımsal olarak oluşturdum (generateUI() metodu). İnşallah, sunucu için geliştireceğim test uygulamasını da Qt Designer kullanarak geliştireceğim,
    • Bu kodları incelerken dikkat edeceğiniz en önemli husus bu görsel bileşenler ve bunları barındıran “layout” sınıfları olacak. O sebeple QT tarafından sunulan “layout” sınıflarına muhakkak olarak göz atmanızda fayda var. Detaylı bilgi için https://doc.qt.io/qt-5/layout.html sayfasını muhakkak bir kere okuyunuz,
  • Bir önceki QT yazımda bahsettiğim sinyal/slot kullanımlarını sık sık görebilirsiniz,
  • Ayrıca sunucu ile olan mesajlaşma geçmişini QT’nin dosya yönetiminin basit kullanımı ile nasıl oluşturulduğunu görebilirsiniz,
  • QtIpItem sınıfı içerisinde, kullanıcıdan girdi almak için sunulan QLineEdit görsel bileşenini, IP adres bilgilerini, formatına uygun bir şekilde alabilmek için, “regular expression” ve ilgili doğrulayıcıların nasıl kullanıldığını görebilirsiniz,
  • MultiPurposeInputField sınıfı içerisinde kullanıcıdan, belirlenen maksimum mesaj boyutuna göre, hem ASCII, hem sayı hem de 16 lık düzende byte byte veri alınmasına olanak sağlayan bileşene göz atabilirsiniz,
  • Bütün bunların yanında QT statik kütüphanelerini de diğer C++ kütüphaneleri gibi VS 2017 de kullanabilirsiniz (yani ilgili basşlık dosyası dizinlerini ekleyip, ilgili projeyi “references” altına ya da proje ayarları altında “Linker->Input->Additional Dependencies” e ekleyebilirsiniz,
  • Uygulama içerisinde kullandığım resimleri dosya sisteminden okumak yerine çalışabilir dosya içerisine eklemek için ise QT nin “Qt Resource Editor” uygulamasını kullanabilirsiniz. Bunun için:
    • Öncelikle .qrc uzantılı bir dosya ekleyelim. Örnek uygulamada “Resources.qrc”,
    • Daha sonra VS çözüm ağacı üzerinde bu dosyanın üzerine çift tıklayalım. VS Qt eklentisi otomatik olarak “Qt Resource Editor” ü açacaktır,

    •  Daha sonra eklemek istediğiniz dosyaları “Add” düğmesini kullanarak ekleyiniz,
    •  Burada “Alias” alanı kod içerisinde erişim için kullanabileceğiniz basit, “Resouce URL” ise bu kaynağa ilişkin kod içerisinde erişim için kullanabileceğiniz tam tanımlayıcı metni temsil eder,
    • Bunları ekledikten sonra kod içerisinde bu kaynakları aşağıdaki gibi kullanabilirsiniz:

  • Kodları olabildiğince Doxygen formatına göre dokümante etmeye çalıştım. Sizlere yardımcı olacaktır,
  • QT, ayrıca birim test için de kabiliyetler sunmakta ve bunların bir kısmını görsel bileşenlerin testleri için de kullanabilirsiniz. Yakın bir zamanda bu konu ile ilgili de bir yazı yazmayı planlıyorum. Orada bu konuya daha detaylı değiniriz,
  • Bu arada bir diğer husus ta, sizin yerel makinanızda QT kurulumuna ilişkin bilgiler .user dosyalarında tutuluyor (ör. NetworkLibrary.vcxproj.user). Bu sebeple bunları kod kontrol altında tutmamalısınız. Aslında bakarsanız, bu dosyaları sadece QT için değil, diğer uygulamalarınız için de kod kontrol altında tutmayın,
  • Birden fazla QT kullanılması durumunda yukarıda bahsettiğim şekilde, proje için kullanmak istediğiniz QT sürümünü seçebilirsiniz.

Evet arkadaşlar, bir yazımızın daha sonuna geldik. Bu yazı ile birlikte QT, soket ve grafiksel kullanıcı arayüzü programlama konularına ilişkin örnek bir uygulamayı inceledik. Artık QT’e daha aşına olduğumuza göre bir sonraki yazımızda, daha farklı bir mecraya adım atabiliriz. Sunucu ile ilgili kısmı da yazdığımda sizleri haberdar edeceğim. Kodu lütfen indirin, inceleyin, hunharca değiştirin ve kullanın. O zaman çok daha fazla faydasını göreceksiniz 😀

Ben yazılımperver, sizlere iyi hafta sonları diliyorum.

2 Comments QT TCP İstemci Uygulaması (BÇOM Serisi – 3)

  1. ayça

    sitenizi çok beğendim. paylaşımlarınız için çok teşekkür ederim. umarım güncel yazılar yazmaya devam edersiniz. ve özellikle visual studio 2019-güncel c++ standartlar- üzerinden soket programlama üzerine içerikler üretirseniz harika olur. -kişisel olarak c++ üzerinden oyun soketlerini öğrenme hedefindeyim. bu konuda çok fazla türkçe kaynak bulamadım. eminim benim gibi birçok kişi c++ için bu sorunu yaşıyordur. sağlıcakla kalınn

    Reply
    1. yazılımperver

      Değerli geri bildiriminiz için çok teşekkürler. Açıkçası uzunca bir süre WinSock kütüphanesi üzerinde soket programlama ile uğraşmıştım fakat tahmin edebileceğiniz üzere, bu kütüphaneler hep platform bağımlı. QT soketleri bu anlamda büyük kolaylık getiriyor, bu sebeple de uzunca süredir kullanıyorum. Alternatif olarak Boost Asio ya da POCO soket kütüphaneleri de bu anlamda kullanılabilir. C++ anlamında ise, bu konuda çalışan bir teknik grup (Networking TS) mevcut ve C++ 23 için taslak bir kullanım sunulmasını umuyorum.

      Reply

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. 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.