Android Socket Programlama

Socket programlama aynı ağdaki iki cihazın birbiriyle haberleşmesini sağlamanın bir yoludur. Biri clienttaki, biri serverdaki olmak üzere iki socket haberleşir.
Bir socketin adresi IP ve porttan ibarettir. Server uygulaması, tanımlı port üzerinden clientları dinlemeye başlar. Client ise serverın IP'si ve açtığı port üzerinden bağlantı kurar. Daha sonra iletişim çift yönlü olarak devam edebilir.

Örnek bir server socket adresi 192.168.1.10:9876
Socket programlama IoT uygulamalarında sıkça tercih edilen bir yöntemdir. Cihazlar ağ üzerinde haberleşirler. İletişim TCP/IP protokolü üzerinden ilerlediği için environment bağımsızdır. Yani Android, bir PLC ile; Arduino, bir Linux makine ile haberleşebilir.
Android'de socket ile veri gönderme/okuma işlemleri network işi olduğu için UI/Main thread'de yapılmamalıdır.
Android uygulamasının server olduğu TCP protokolünü kullanan bir senaryoya bakalım:
Manifest dosyasına izinleri ekliyoruz
Uygulamanın arka planda ve uzun süreli çalışması, Android tarafından kill edilmesini istemediğimiz için foreground service oluşturalım.
Foreground service ayaklandığında, yani onCreate'te, socket işlemleri için yeni bir thread oluşturalım, çünkü hala main thread'deyiz.
Foregorund service notification ayarlarını ekleyelim.
Oluşturduğumuz threadde socketimizi port numarası ile tanımladık, şimdi clientları dinlemeye başlayabiliriz.
Her yeni client bağlantısı için yeni bir thread oluşturuyoruz
Bağlı clienttan gelen mesajı dinleyip cevap olarak "Hello Client" mesajını dönüyoruz
Manifest dosyasında service'imizi tanıtalım
Service'i launcher activity'den başlatalım
Bu uygulamayı Android cihazınızda çalıştırıp, aynı ağdaki bilgisayarınız ile de terminalden (Linux, Windows, MacOS) netcat toolu yardımıyla client bağlantısı kurabilir, mesaj gönderebilirsiniz:
nc 192.168.1.10 9876
TCP server uygulamasını en basit haliyle oluşturduk. Client uygulaması da oldukça benzer şekilde oluşturulabiliyor.
Örneği sadeleştirmek adına kullanıcı etkileşimini dahil etmedik. Grafik arayüz geliştirmeleri ile port, gönderilecek mesaj değiştirilebilir hale getirilebilir.
Birbiri ile haberleşecek şekilde tasarlanan client ve server uygulamalarının kaynak kodlarına buradan erişebilirsiniz:
https://github.com/perihanmirkelam/TcpServer
https://github.com/perihanmirkelam/TcpClient
Kaynaklar:
https://developer.android.com/reference/java/net/Socket
https://docs.oracle.com/javase/tutorial/networking/sockets/index.html
https://www.cs.dartmouth.edu/~campbell/cs50/socketprogramming.html
https://www.geeksforgeeks.org/introducing-threads-socket-programming-java/
https://www.tutorialspoint.com/unix_sockets/what_is_socket.htm
https://www.tutorialspoint.com/sending-and-receiving-data-with-sockets-in-android
#socketprogramming #android #androidsocket