Java Socket Programlama
Java Socket Programlamaya geçmeden önce socket kavramına açıklık getirmek istiyorum. Socket dendiği zaman birçok kişinin zihninde canlanan bilgisayarlarımızın üzerinde bulunan somut bir donanımsal parça oluyor. Aslında socket; Bilgisayarların ağ üzerinden haberleşmesini sağlayan yapılardır. Tabi bunun için bazı adresler kullanmak zorundayız. Bunlardan ilki bilgisayarın IP adresi.
IP adresi yardımıyla hangi bilgisayarla haberleşeceğimizi belirleriz. Haberleşilecek bilgisayara ulaşıldığı zaman, bu bilgisayar üzerinde hangi programla iletişime geçeceğimizi belirtmemiz gerekiyor . İşte burada bilgisayarlarımızın portları devreye giriyor. Yani iki bilgisayar birbiriyle bu iki yapı vasıtasıyla haberleşir (IP adresi ve Port). Socket ‘i açıklarken Port ve IP adresine nereden geldiniz diye sorabilirisiniz 🙂 Socket de zaten belirttiğim bu iki kavramdan oluşuyor. Yani socket bilindiğinin aksine donanımsal bir parça değil IP adresi ve port numasından oluşmuş bir yapıdır.
Bilgisayarlarımız üzerinde bir çok socket bulunur. Her socket tabanlı program için bilgisayar üzerinde ayrı port açılmıştır. Örneğin ftp sunucuları 21. portta, telnet ise 23. portta çalışmaktadır.
Socket programlama hakkında özet bir bilgiden sonra konunun daha anlaşılır olabilmesi için yaptığım küçük bir uygulamayı paylaşmak istiyorum.
Program, clientın server‘a gönderdiği sayının server tarafından karesi alınıp tekrar client’ a iletmesinden oluşuyor. Burada karşımıza client ve server terimleri çıktı. Bu iki kavramdan da kısa bir şekilde bahsedelim;
Client’ı socket programlarda hizmet isteyen istemci olarak adlandırabiliriz. İstediği zaman server’a bağlanıp istekte bulunur ve serverdan dönen cevabı alır. Yine istediği zaman bağlantıyı koparabilir.
Server da bu durumda socket programlarda hizmet veren sunucu oluyor. Client istediği zaman sunucuya bağlanabileceği için serverın sürekli açık olup, Clientın bağlanacağı portu dinliyor olması gerekmektedir.
Şimdi projenin kodlarını inceleyelim;
Client Kodları:
package socketapp; import java.io.*; import java.net.*; public class client { public static void main(String[] args) throws IOException { islem(); } public static void islem() throws UnknownHostException, IOException { Socket socket = null; PrintWriter out = null; BufferedReader in = null; String deger; try { //* server 'a localhost ve 7755 portu üzerinden başlantı sağlanıyor *// socket = new Socket("localhost", 7755); } catch (Exception e) { System.out.println("Port Hatası!"); }
Yukarıda socket = new Socket (“localhost”,7755) olarak yazmamın sebebi projemi localde çalıştırıyor olmamdır. Yine localhost yerine 170.0.0.1 de yazabilirdik. Ama siz bu kısıma bağlanmak istediğiniz bilgisayarın (yani serverın) IP adresini yazabilirsiniz.
//* Server'a veri gönderimi için kullandığımız PrintWriter nesnesi oluşturduk *// out = new PrintWriter(socket.getOutputStream(), true); //* Server'dan gelen verileri tutan BufferedReader nesnesi oluşturulur *// in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Server'a gönderilecek sayısı giriniz:"); //* Gönderilecek sayının girişi yapılıyor *// BufferedReader data = new BufferedReader(new InputStreamReader(System.in)); while((deger = data.readLine()) != null) { out.println(deger); System.out.println("Server'dan gelen sonuç = " + in.readLine()); System.out.println("Server'a gönderilecek saysı giriniz"); } out.close(); in.close(); data.close(); socket.close(); } }
out.println(deger); koduyla Server ‘a datamızı gönderiyoruz.
Server Kodları:
package socketapp; import java.io.*; import java.net.*; public class server { public static void main(String[] args) throws IOException { String clientGelen; ServerSocket serverSocket = null; Socket clientSocket = null; int sayi; try { //*Server 7755 portundan Client'ı dinliyor *// serverSocket = new ServerSocket(7755); } catch (Exception e) { System.out.println("Port Hatası!"); } System.out.println("SERVER BAŞLANTI İÇİN HAZIR...");
Server 7755 portunu client’ ın bağlanması için dinliyor. Port açarken dikkat etmemiz gereken önemli bir konuda portun 1 ile 1024 arasında olmamasıdır. Çünkü bu değer aralıklarındaki portlar spesifik portlardır ve root tarafından kullanılır. Eğer 1-1024 arasında bir portu kullanmaya çalışırsak programımız “bind permission” hatası verecektir.
//* Bağlantı sağlamadan program bir alt satırdaki kod parçasına geçmez (accept) *// clientSocket = serverSocket.accept(); //* Client'a veri gönderimi için kullandığımız PrintWriter nesnesi oluşturulur *// PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); //* Client'dan gelen verileri tutan BufferedReader nesnesi oluşturulur *// BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); while((clientGelen = in.readLine()) != null) { System.out.println("Client'dan gelen veri = " + clientGelen); sayi = Integer.valueOf(clientGelen); out.println(sayi*sayi); } out.close(); in.close(); clientSocket.close(); serverSocket.close(); } }
clientGelen=in.readLine(); komutu istemciden gelen datayı okur ve clientGelen değişkenine aktarır. out.println(sayi*sayi) komutu ile istemciden gelen sayının karesini alıp tekrar istemciye iletiyoruz.
Programın ekran çıktıları şu şekildedir;
Client ekran çıktısı:
Server ekran çıktısı:
Java socket programlamayı özet bir şekilde anlatmaya çalıştım umarım faydalı bir yazı olmuştur. Bir sonraki yazımda socket pragramlamayı Android uygulaması üzerinde anlatmaya çalışacağım şimdilik konunun özeti bu kadar.
NOT: Projeyi çalıştırırken server class’ını ilk olarak çalıştırın. Çünkü clientın servera bağlanabilmesi için serverın açtığı portu dinliyor olması gerekir.
Herkese iyi çalışmalar diliyorum..
Misafir yazılım sever 🙂