{"id":37884,"date":"2026-01-17T19:41:29","date_gmt":"2026-01-17T16:41:29","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37884"},"modified":"2026-01-17T19:41:29","modified_gmt":"2026-01-17T16:41:29","slug":"java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/","title":{"rendered":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi<\/h2>\n<p>\u0130nternet ve a\u011f tabanl\u0131 uygulamalar\u0131n temelini olu\u015fturan ileti\u015fim mekanizmalar\u0131ndan biri de soket programlamad\u0131r. Java, g\u00fc\u00e7l\u00fc ve esnek a\u011f API&#8217;leri sayesinde soket programlamay\u0131 olduk\u00e7a kolayla\u015ft\u0131rmaktad\u0131r. Bu rehberde, Java&#8217;da soket sunucu ve istemci uygulamalar\u0131n\u0131n nas\u0131l geli\u015ftirilece\u011fini ad\u0131m ad\u0131m inceleyecek, temel kavramlardan ba\u015flayarak pratik \u00f6rneklere ve \u00f6nemli ipu\u00e7lar\u0131na yer verece\u011fiz.<\/p>\n<h3>Giri\u015f: A\u011f \u0130leti\u015fiminin Temelleri ve Soketler<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn ba\u011flant\u0131l\u0131 d\u00fcnyas\u0131nda, uygulamalar\u0131n birbirleriyle ileti\u015fim kurmas\u0131 ka\u00e7\u0131n\u0131lmaz bir gerekliliktir. Web taray\u0131c\u0131n\u0131z\u0131n bir sunucuya ba\u011flanmas\u0131, anl\u0131k mesajla\u015fma uygulamalar\u0131n\u0131n mesaj g\u00f6ndermesi veya bir oyunun \u00e7ok oyunculu modda \u00e7al\u0131\u015fmas\u0131 gibi senaryolar\u0131n hepsi a\u011f ileti\u015fimi \u00fczerine kuruludur. Bu ileti\u015fimin en temel yap\u0131 ta\u015flar\u0131ndan biri &#8220;soket&#8221;lerdir.<\/p>\n<p>Soket, bir a\u011fdaki iki program\u0131n birbiriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan bir u\u00e7 noktad\u0131r. T\u0131pk\u0131 bir telefon hatt\u0131n\u0131n iki ucundaki telefonlar gibi, soketler de iki uygulama aras\u0131nda veri al\u0131\u015fveri\u015fi i\u00e7in bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Java&#8217;da soket programlama, genellikle TCP\/IP protokol\u00fcn\u00fc kullanarak g\u00fcvenilir, ba\u011flant\u0131 tabanl\u0131 bir ileti\u015fim sa\u011flar. Bu modelde bir &#8220;sunucu&#8221; bir portu dinlerken, &#8220;istemciler&#8221; bu sunucuya ba\u011flanarak ileti\u015fim ba\u015flat\u0131r. Java&#8217;n\u0131n <code>java.net<\/code> paketi, soket tabanl\u0131 uygulamalar geli\u015ftirmek i\u00e7in gerekli t\u00fcm s\u0131n\u0131flar\u0131 (\u00f6rne\u011fin <code>Socket<\/code> ve <code>ServerSocket<\/code>) sunar.<\/p>\n<h3>Temel Java Soket Kavramlar\u0131<\/h3>\n<p>Java&#8217;da soket programlama yaparken anlamam\u0131z gereken birka\u00e7 temel s\u0131n\u0131f ve kavram bulunmaktad\u0131r. Bu kavramlar, sunucu ve istemci uygulamalar\u0131n\u0131n iskeletini olu\u015fturur.<\/p>\n<h4>ServerSocket S\u0131n\u0131f\u0131 (Sunucu Taraf\u0131)<\/h4>\n<p><code>ServerSocket<\/code> s\u0131n\u0131f\u0131, sunucu taraf\u0131nda gelen istemci ba\u011flant\u0131lar\u0131n\u0131 dinlemek ve kabul etmek i\u00e7in kullan\u0131l\u0131r. Bir <code>ServerSocket<\/code> nesnesi belirli bir port numaras\u0131n\u0131 dinlemeye ba\u015flar. Bir istemci bu porta ba\u011flanmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, <code>ServerSocket<\/code> ba\u011flant\u0131y\u0131 kabul eder ve ileti\u015fim i\u00e7in yeni bir <code>Socket<\/code> nesnesi olu\u015fturur.<\/p>\n<p>*   <strong><code>ServerSocket(int port)<\/code>:<\/strong> Belirtilen port numaras\u0131nda yeni bir sunucu soketi olu\u015fturur.<br \/>\n*   <strong><code>Socket accept()<\/code>:<\/strong> Gelen bir ba\u011flant\u0131y\u0131 kabul eder ve bu ba\u011flant\u0131 i\u00e7in yeni bir <code>Socket<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr. Bu metod, bir istemci ba\u011flanana kadar program\u0131n ak\u0131\u015f\u0131n\u0131 bloke eder (durdurur).<br \/>\n*   <strong><code>close()<\/code>:<\/strong> Sunucu soketini kapat\u0131r ve portu serbest b\u0131rak\u0131r.<\/p>\n<h4>Socket S\u0131n\u0131f\u0131 (\u0130stemci Taraf\u0131 ve Sunucu-\u0130stemci \u0130leti\u015fimi)<\/h4>\n<p><code>Socket<\/code> s\u0131n\u0131f\u0131 hem istemci taraf\u0131nda sunucuya ba\u011flanmak i\u00e7in hem de sunucu taraf\u0131nda kabul edilen her bir istemci ile ileti\u015fim kurmak i\u00e7in kullan\u0131l\u0131r. Bir <code>Socket<\/code> nesnesi, iki uygulama aras\u0131nda ger\u00e7ek veri al\u0131\u015fveri\u015finin yap\u0131ld\u0131\u011f\u0131 kanal\u0131 temsil eder.<\/p>\n<p>*   <strong><code>Socket(String host, int port)<\/code>:<\/strong> Belirtilen ana bilgisayar (IP adresi veya alan ad\u0131) ve port numaras\u0131na ba\u011flanmaya \u00e7al\u0131\u015fan yeni bir istemci soketi olu\u015fturur.<br \/>\n*   <strong><code>InputStream getInputStream()<\/code>:<\/strong> Soket \u00fczerinden veri okumak i\u00e7in bir <code>InputStream<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>OutputStream getOutputStream()<\/code>:<\/strong> Soket \u00fczerinden veri yazmak i\u00e7in bir <code>OutputStream<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>close()<\/code>:<\/strong> Soketi kapat\u0131r ve ba\u011flant\u0131y\u0131 sonland\u0131r\u0131r.<\/p>\n<h4>Giri\u015f\/\u00c7\u0131k\u0131\u015f Ak\u0131\u015flar\u0131 (Input\/Output Streams)<\/h4>\n<p>Soketler \u00fczerinden veri al\u0131\u015fveri\u015fi, Java&#8217;n\u0131n standart <code>InputStream<\/code> ve <code>OutputStream<\/code> s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Genellikle bu ham ak\u0131\u015flar, metin tabanl\u0131 veya daha karma\u015f\u0131k veri yap\u0131lar\u0131 i\u00e7in <code>BufferedReader<\/code>, <code>PrintWriter<\/code>, <code>ObjectInputStream<\/code>, <code>ObjectOutputStream<\/code> gibi daha \u00fcst d\u00fczey ak\u0131\u015flarla sarmalan\u0131r.<\/p>\n<p>*   <strong><code>BufferedReader<\/code>:<\/strong> Karakter tabanl\u0131 veriyi sat\u0131r sat\u0131r okumak i\u00e7in etkilidir.<br \/>\n*   <strong><code>PrintWriter<\/code>:<\/strong> Karakter tabanl\u0131 veriyi sat\u0131r sat\u0131r yazmak i\u00e7in etkilidir. <code>println()<\/code> metodu ile kolayca sat\u0131r sonu ekler.<\/p>\n<h4>Port ve IP Adresi<\/h4>\n<p>*   <strong>IP Adresi:<\/strong> Bir a\u011fdaki cihaz\u0131 benzersiz \u015fekilde tan\u0131mlayan bir numarad\u0131r (\u00f6rn. <code>192.168.1.1<\/code>). <code>localhost<\/code> veya <code>127.0.0.1<\/code> \u00f6zel IP adresleri, uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 makineyi ifade eder.<br \/>\n*   <strong>Port Numaras\u0131:<\/strong> Bir IP adresi \u00fczerindeki belirli bir uygulamay\u0131 veya hizmeti tan\u0131mlayan bir numarad\u0131r (\u00f6rn. HTTP i\u00e7in 80, HTTPS i\u00e7in 443). 1-1023 aras\u0131ndaki portlar genellikle bilinen hizmetler i\u00e7in ayr\u0131lm\u0131\u015ft\u0131r; kendi uygulamalar\u0131n\u0131z i\u00e7in genellikle 1024 ve \u00fczeri portlar\u0131 kullanman\u0131z \u00f6nerilir.<\/p>\n<h3>Java Soket Sunucu Uygulamas\u0131<\/h3>\n<p>Bir sunucu uygulamas\u0131, gelen ba\u011flant\u0131lar\u0131 bekler, kabul eder ve istemcilerle ileti\u015fim kurar. Genellikle, bir sunucu ayn\u0131 anda birden fazla istemciyi y\u00f6netebilmelidir; bu da genellikle \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 (multi-threading) kullan\u0131m\u0131yla sa\u011flan\u0131r. \u015eimdi basit, tek i\u015f par\u00e7ac\u0131kl\u0131 bir &#8220;echo&#8221; sunucusu \u00f6rne\u011fi olu\u015ftural\u0131m. Bu sunucu, istemciden ald\u0131\u011f\u0131 mesaj\u0131 geri g\u00f6nderecektir.<\/p>\n<pre><code class=\"language-java\">import java.io.*;\nimport java.net.*;\n\npublic class SimpleEchoServer {\n    private static final int PORT = 12345;\n\n    public static void main(String[] args) {\n        System.out.println(\"Sunucu ba\u015flat\u0131l\u0131yor...\");\n        try (ServerSocket serverSocket = new ServerSocket(PORT)) {\n            System.out.println(\"Sunucu \" + PORT + \" portunda dinlemede.\");\n\n            while (true) { \/\/ Sonsuz d\u00f6ng\u00fcde istemci ba\u011flant\u0131lar\u0131n\u0131 bekle\n                Socket clientSocket = serverSocket.accept(); \/\/ Bir istemci ba\u011flanana kadar bloklar\n                System.out.println(\"Yeni bir istemci ba\u011fland\u0131: \" + clientSocket.getInetAddress().getHostAddress());\n\n                \/\/ \u0130stemci ile ileti\u015fim kurmak i\u00e7in giri\u015f\/\u00e7\u0131k\u0131\u015f ak\u0131\u015flar\u0131n\u0131 ayarla\n                try (\n                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));\n                    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); \/\/ Auto-flush etkin\n                ) {\n                    String inputLine;\n                    while ((inputLine = in.readLine()) != null) {\n                        System.out.println(\"\u0130stemciden gelen: \" + inputLine);\n                        out.println(\"Sunucudan yank\u0131: \" + inputLine); \/\/ \u0130stemciye geri g\u00f6nder\n                        if (inputLine.equals(\"bye\")) {\n                            break; \/\/ \"bye\" gelirse bu istemciyle ileti\u015fimi sonland\u0131r\n                        }\n                    }\n                } catch (IOException e) {\n                    System.err.println(\"\u0130stemci ile ileti\u015fim hatas\u0131: \" + e.getMessage());\n                } finally {\n                    clientSocket.close(); \/\/ \u0130stemci soketini kapat\n                    System.out.println(\"\u0130stemci ba\u011flant\u0131s\u0131 kapat\u0131ld\u0131.\");\n                }\n            }\n        } catch (IOException e) {\n            System.err.println(\"Sunucu ba\u015flat\u0131l\u0131rken veya \u00e7al\u0131\u015f\u0131rken hata olu\u015ftu: \" + e.getMessage());\n        }\n    }\n}<\/code><\/pre>\n<p><strong>Kod A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>1.  <strong><code>ServerSocket serverSocket = new ServerSocket(PORT)<\/code>:<\/strong> Sunucu, 12345 numaral\u0131 portu dinlemek \u00fczere ba\u015flat\u0131l\u0131r. <code>try-with-resources<\/code> blo\u011fu sayesinde <code>ServerSocket<\/code> otomatik olarak kapat\u0131l\u0131r.<br \/>\n2.  <strong><code>while (true)<\/code>:<\/strong> Sunucu, s\u00fcrekli olarak yeni istemci ba\u011flant\u0131lar\u0131n\u0131 beklemek i\u00e7in sonsuz bir d\u00f6ng\u00fcye girer.<br \/>\n3.  <strong><code>Socket clientSocket = serverSocket.accept()<\/code>:<\/strong> Bu metod, bir istemci ba\u011flanana kadar program\u0131n ak\u0131\u015f\u0131n\u0131 durdurur. Bir istemci ba\u011fland\u0131\u011f\u0131nda, o istemciyle ileti\u015fim kurmak i\u00e7in yeni bir <code>Socket<\/code> nesnesi d\u00f6nd\u00fcr\u00fcl\u00fcr.<br \/>\n4.  <strong><code>BufferedReader in<\/code> ve <code>PrintWriter out<\/code>:<\/strong> \u0130stemciden gelen veriyi okumak ve ona veri yazmak i\u00e7in ak\u0131\u015flar olu\u015fturulur. <code>PrintWriter<\/code>&#8216;\u0131n <code>true<\/code> parametresi, her <code>println()<\/code> \u00e7a\u011fr\u0131s\u0131nda veriyi otomatik olarak g\u00f6nderilmesini (flush) sa\u011flar.<br \/>\n5.  <strong><code>while ((inputLine = in.readLine()) != null)<\/code>:<\/strong> \u0130stemciden gelen mesajlar sat\u0131r sat\u0131r okunur.<br \/>\n6.  <strong><code>out.println(\"Sunucudan yank\u0131: \" + inputLine)<\/code>:<\/strong> Okunan mesaj\u0131n ba\u015f\u0131na &#8220;Sunucudan yank\u0131:&#8221; eklenerek istemciye geri g\u00f6nderilir.<br \/>\n7.  <strong><code>if (inputLine.equals(\"bye\")) { break; }<\/code>:<\/strong> E\u011fer istemci &#8220;bye&#8221; mesaj\u0131n\u0131 g\u00f6nderirse, bu istemciyle olan ileti\u015fim d\u00f6ng\u00fcs\u00fc sonland\u0131r\u0131l\u0131r.<br \/>\n8.  <strong><code>clientSocket.close()<\/code>:<\/strong> \u0130stemciyle ileti\u015fim bitti\u011finde, o istemciye ait soket kapat\u0131l\u0131r.<\/p>\n<p><strong>Pratik Bilgi:<\/strong> Yukar\u0131daki sunucu tek bir istemciye hizmet verebilir. \u0130kinci bir istemci ba\u011flanmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, ilk istemciyle olan ileti\u015fim bitene kadar beklemek zorunda kalacakt\u0131r. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, her yeni istemci ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131 (thread) ba\u015flatarak e\u015f zamanl\u0131 hizmet sa\u011flamak yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Java Soket \u0130stemci Uygulamas\u0131<\/h3>\n<p>\u0130stemci uygulamas\u0131, belirli bir sunucuya (IP adresi ve port numaras\u0131 kullanarak) ba\u011flan\u0131r, sunucuya veri g\u00f6nderir ve sunucudan gelen veriyi okur. \u015eimdi yukar\u0131daki echo sunucumuzla ileti\u015fim kuracak basit bir istemci \u00f6rne\u011fi olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">import java.io.*;\nimport java.net.*;\nimport java.util.Scanner;\n\npublic class SimpleEchoClient {\n    private static final String SERVER_ADDRESS = \"localhost\"; \/\/ Sunucunun IP adresi veya alan ad\u0131\n    private static final int SERVER_PORT = 12345; \/\/ Sunucunun dinledi\u011fi port\n\n    public static void main(String[] args) {\n        System.out.println(\"\u0130stemci ba\u015flat\u0131l\u0131yor...\");\n        try (\n            Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT); \/\/ Sunucuya ba\u011flan\n            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\n            PrintWriter out = new PrintWriter(socket.getOutputStream(), true); \/\/ Auto-flush etkin\n            Scanner scanner = new Scanner(System.in) \/\/ Kullan\u0131c\u0131dan girdi almak i\u00e7in\n        ) {\n            System.out.println(\"Sunucuya ba\u011fland\u0131: \" + SERVER_ADDRESS + \":\" + SERVER_PORT);\n            String userInput;\n            String serverResponse;\n\n            while (true) {\n                System.out.print(\"Mesaj\u0131n\u0131z\u0131 girin (\u00e7\u0131kmak i\u00e7in 'bye'): \");\n                userInput = scanner.nextLine(); \/\/ Kullan\u0131c\u0131dan mesaj al\n\n                out.println(userInput); \/\/ Mesaj\u0131 sunucuya g\u00f6nder\n                System.out.println(\"G\u00f6nderilen: \" + userInput);\n\n                serverResponse = in.readLine(); \/\/ Sunucudan yan\u0131t bekle\n                if (serverResponse != null) {\n                    System.out.println(\"Sunucudan gelen: \" + serverResponse);\n                } else {\n                    System.out.println(\"Sunucu ba\u011flant\u0131s\u0131 kapand\u0131.\");\n                    break;\n                }\n\n                if (userInput.equals(\"bye\")) {\n                    break; \/\/ \"bye\" g\u00f6nderilirse istemciyi kapat\n                }\n            }\n        } catch (UnknownHostException e) {\n            System.err.println(\"Bilinmeyen ana bilgisayar: \" + SERVER_ADDRESS);\n        } catch (IOException e) {\n            System.err.println(\"Sunucuya ba\u011flan\u0131rken veya ileti\u015fim s\u0131ras\u0131nda hata olu\u015ftu: \" + e.getMessage());\n        } finally {\n            System.out.println(\"\u0130stemci ba\u011flant\u0131s\u0131 kapat\u0131ld\u0131.\");\n        }\n    }\n}<\/code><\/pre>\n<p><strong>Kod A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>1.  <strong><code>Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT)<\/code>:<\/strong> \u0130stemci, <code>SERVER_ADDRESS<\/code> (bu \u00f6rnekte <code>localhost<\/code>) ve <code>SERVER_PORT<\/code> (12345) kullanarak sunucuya ba\u011flan\u0131r. <code>try-with-resources<\/code> sayesinde soket otomatik olarak kapat\u0131l\u0131r.<br \/>\n2.  <strong><code>BufferedReader in<\/code> ve <code>PrintWriter out<\/code>:<\/strong> Sunucudan gelen veriyi okumak ve sunucuya veri yazmak i\u00e7in ak\u0131\u015flar olu\u015fturulur.<br \/>\n3.  <strong><code>Scanner scanner = new Scanner(System.in)<\/code>:<\/strong> Kullan\u0131c\u0131n\u0131n konsoldan mesaj girmesini sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n4.  <strong><code>while (true)<\/code>:<\/strong> Kullan\u0131c\u0131n\u0131n s\u00fcrekli mesaj g\u00f6nderebilmesi i\u00e7in bir d\u00f6ng\u00fc.<br \/>\n5.  <strong><code>userInput = scanner.nextLine()<\/code>:<\/strong> Kullan\u0131c\u0131n\u0131n girdi\u011fi metni okur.<br \/>\n6.  <strong><code>out.println(userInput)<\/code>:<\/strong> Kullan\u0131c\u0131n\u0131n mesaj\u0131n\u0131 sunucuya g\u00f6nderir.<br \/>\n7.  <strong><code>serverResponse = in.readLine()<\/code>:<\/strong> Sunucudan gelen yan\u0131t\u0131 bekler ve okur.<br \/>\n8.  <strong><code>if (userInput.equals(\"bye\")) { break; }<\/code>:<\/strong> Kullan\u0131c\u0131 &#8220;bye&#8221; yazarsa, istemci d\u00f6ng\u00fcs\u00fc sonland\u0131r\u0131l\u0131r ve uygulama kapan\u0131r.<\/p>\n<p><strong>Pratik Bilgi:<\/strong> \u0130stemci uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce sunucu uygulamas\u0131n\u0131n \u00e7al\u0131\u015f\u0131yor ve ba\u011flant\u0131lar\u0131 bekliyor olmas\u0131 gerekir. Aksi takdirde istemci, <code>Connection refused<\/code> (Ba\u011flant\u0131 reddedildi) gibi bir <code>IOException<\/code> alacakt\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve Pratik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Java soket programlama, basit uygulamalar\u0131n \u00f6tesine ge\u00e7erek daha karma\u015f\u0131k ve sa\u011flam sistemler kurmak i\u00e7in de kullan\u0131labilir. \u0130\u015fte baz\u0131 \u00f6nemli ipu\u00e7lar\u0131 ve ileri konular:<\/p>\n<h4>\u00c7oklu \u0130stemci Y\u00f6netimi (Multi-threading)<\/h4>\n<p>Yukar\u0131daki basit sunucu \u00f6rne\u011fi ayn\u0131 anda yaln\u0131zca bir istemciye hizmet verebilir. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, sunucunun birden fazla istemciyle e\u015f zamanl\u0131 olarak ileti\u015fim kurmas\u0131 gerekir. Bunu sa\u011flamak i\u00e7in, <code>ServerSocket.accept()<\/code> metodu yeni bir istemci ba\u011flant\u0131s\u0131n\u0131 kabul etti\u011finde, o istemciyle ileti\u015fimi ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131na devretmek yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ Sunucu taraf\u0131nda, accept() sonras\u0131:\nSocket clientSocket = serverSocket.accept();\nSystem.out.println(\"Yeni istemci ba\u011fland\u0131: \" + clientSocket.getInetAddress().getHostAddress());\nnew Thread(new ClientHandler(clientSocket)).start(); \/\/ Yeni bir i\u015f par\u00e7ac\u0131\u011f\u0131 ba\u015flat<\/code><\/pre>\n<p><code>ClientHandler<\/code> s\u0131n\u0131f\u0131, <code>Runnable<\/code> aray\u00fcz\u00fcn\u00fc uygulayan ve bir istemci soketi alarak onunla ileti\u015fim mant\u0131\u011f\u0131n\u0131 i\u00e7eren ayr\u0131 bir s\u0131n\u0131f olacakt\u0131r. Bu yakla\u015f\u0131m, her istemcinin kendi i\u015f par\u00e7ac\u0131\u011f\u0131na sahip olmas\u0131n\u0131 ve sunucunun <code>accept()<\/code> metodunu bloke etmeden yeni ba\u011flant\u0131lar\u0131 dinlemeye devam etmesini sa\u011flar. <code>ExecutorService<\/code> kullanarak i\u015f par\u00e7ac\u0131\u011f\u0131 havuzlar\u0131 y\u00f6netmek de daha performansl\u0131 bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h4>Kaynaklar\u0131 Do\u011fru Kapatma<\/h4>\n<p>Soketler ve ak\u0131\u015flar gibi a\u011f kaynaklar\u0131, i\u015fleri bitti\u011finde kapat\u0131lmal\u0131d\u0131r. Aksi takdirde, bellek s\u0131z\u0131nt\u0131lar\u0131na veya portlar\u0131n gereksiz yere me\u015fgul kalmas\u0131na neden olabilir. Java 7 ile gelen <code>try-with-resources<\/code> yap\u0131s\u0131, bu kaynaklar\u0131n otomatik olarak kapat\u0131lmas\u0131n\u0131 sa\u011flayarak bu i\u015flemi \u00e7ok daha g\u00fcvenli ve kolay hale getirir. Yukar\u0131daki \u00f6rneklerde bu yap\u0131 kullan\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>A\u011f ileti\u015fimi do\u011fas\u0131 gere\u011fi hatalara a\u00e7\u0131kt\u0131r (ba\u011flant\u0131 kopmas\u0131, sunucuya ula\u015f\u0131lamamas\u0131 vb.). Bu nedenle, <code>IOException<\/code> gibi istisnalar\u0131 uygun \u015fekilde yakalamak ve i\u015flemek kritik \u00f6neme sahiptir. Kullan\u0131c\u0131ya anlaml\u0131 geri bildirim sa\u011flamak ve uygulaman\u0131n beklenmedik durumlarda \u00e7\u00f6kmesini \u00f6nlemek i\u00e7in kapsaml\u0131 <code>try-catch<\/code> bloklar\u0131 kullan\u0131n.<\/p>\n<h4>G\u00fcvenlik (SSL\/TLS)<\/h4>\n<p>Yukar\u0131daki \u00f6rnekler \u015fifresiz ileti\u015fim kurar. Hassas verilerin aktar\u0131ld\u0131\u011f\u0131 uygulamalar i\u00e7in bu g\u00fcvenli de\u011fildir. Java, <code>SSLSocket<\/code> ve <code>SSLServerSocket<\/code> s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla SSL\/TLS (Secure Sockets Layer\/Transport Layer Security) kullanarak \u015fifreli ve g\u00fcvenli soket ileti\u015fimi sa\u011flar. Bu, verilerin a\u011f \u00fczerinde aktar\u0131l\u0131rken \u015fifrelenmesini ve kimlik do\u011frulamas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h4>Performans \u0130pu\u00e7lar\u0131<\/h4>\n<p>*   <strong>Tamponlama (Buffering):<\/strong> <code>BufferedReader<\/code> ve <code>BufferedWriter<\/code> gibi tamponlu ak\u0131\u015flar\u0131 kullanmak, her karakter veya bayt i\u00e7in ayr\u0131 ayr\u0131 okuma\/yazma i\u015flemi yapmak yerine verileri bloklar halinde i\u015fleyerek performans\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Verimli Veri Serile\u015ftirme:<\/strong> Karma\u015f\u0131k nesneleri aktar\u0131rken, <code>ObjectInputStream<\/code> ve <code>ObjectOutputStream<\/code> kullanmak yerine JSON, Protocol Buffers veya Avro gibi daha verimli serile\u015ftirme k\u00fct\u00fcphanelerini de\u011ferlendirmek, a\u011f trafi\u011fini ve i\u015flem y\u00fck\u00fcn\u00fc azaltabilir.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Java&#8217;da soket programlama, a\u011f tabanl\u0131 uygulamalar\u0131n temelini olu\u015fturan g\u00fc\u00e7l\u00fc bir yetenektir. Bu rehberde, <code>ServerSocket<\/code> ve <code>Socket<\/code> s\u0131n\u0131flar\u0131n\u0131 kullanarak basit bir echo sunucusu ve istemcisi olu\u015fturmay\u0131 \u00f6\u011frendik. Ayr\u0131ca, \u00e7oklu istemci y\u00f6netimi, kaynak y\u00f6netimi, hata i\u015fleme ve g\u00fcvenlik gibi pratik ve geli\u015fmi\u015f konulara da de\u011findik. Bu bilgilerle, Java&#8217;da kendi a\u011f uygulamalar\u0131n\u0131z\u0131 geli\u015ftirmeye ba\u015flayabilir, istemci-sunucu mimarisinin sundu\u011fu esnekli\u011fi ve g\u00fcc\u00fc ke\u015ffedebilirsiniz.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<p><strong>S1: <code>ServerSocket.accept()<\/code> metodu neden program\u0131n ak\u0131\u015f\u0131n\u0131 bloke eder?<\/strong><br \/>\n<strong>C1:<\/strong> <code>accept()<\/code> metodu, bir istemci ba\u011flant\u0131s\u0131 gelene kadar bekler. Bu bekleme, sunucunun s\u00fcrekli olarak yeni ba\u011flant\u0131lar\u0131 dinlemesini ve bir ba\u011flant\u0131 geldi\u011finde onu kabul etmesini sa\u011flar. Tek i\u015f par\u00e7ac\u0131kl\u0131 bir sunucuda, bu metot bloke oldu\u011funda ba\u015fka hi\u00e7bir i\u015flem yap\u0131lamaz. Bu y\u00fczden \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullan\u0131l\u0131r.<\/p>\n<p><strong>S2: Tek bir sunucu ayn\u0131 anda birden fazla istemciyi nas\u0131l y\u00f6netir?<\/strong><br \/>\n<strong>C2:<\/strong> Sunucu, her yeni istemci ba\u011flant\u0131s\u0131 kabul edildi\u011finde (yani <code>accept()<\/code> metodu yeni bir <code>Socket<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde) o istemciyle ileti\u015fimi ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131na (thread) devreder. Bu sayede, ana sunucu i\u015f par\u00e7ac\u0131\u011f\u0131 yeni ba\u011flant\u0131lar\u0131 dinlemeye devam ederken, her istemci kendi i\u015f par\u00e7ac\u0131\u011f\u0131nda e\u015f zamanl\u0131 olarak hizmet alabilir. Java&#8217;n\u0131n <code>Thread<\/code> s\u0131n\u0131f\u0131 veya <code>ExecutorService<\/code> ile i\u015f par\u00e7ac\u0131\u011f\u0131 havuzlar\u0131 kullan\u0131larak bu sa\u011flan\u0131r.<\/p>\n<p><strong>S3: <code>localhost<\/code> veya <code>127.0.0.1<\/code> nedir?<\/strong><br \/>\n<strong>C3:<\/strong> <code>localhost<\/code> veya <code>127.0.0.1<\/code> \u00f6zel IP adresleri, uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 yerel makineyi (yani kendi bilgisayar\u0131n\u0131z\u0131) ifade eder. Bu, sunucu ve istemcinin ayn\u0131 bilgisayar \u00fczerinde \u00e7al\u0131\u015fmas\u0131 durumunda ileti\u015fimi test etmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><strong>S4: Port numaras\u0131 se\u00e7erken nelere dikkat etmeliyim?<\/strong><br \/>\n<strong>C4:<\/strong> Port numaralar\u0131 0 ile 65535 aras\u0131nda de\u011fi\u015fir. 0-1023 aras\u0131ndaki portlar genellikle sistem hizmetleri i\u00e7in ayr\u0131lm\u0131\u015ft\u0131r (\u00f6rn. HTTP i\u00e7in 80, FTP i\u00e7in 21). Kendi uygulamalar\u0131n\u0131z i\u00e7in genellikle 1024&#8217;ten b\u00fcy\u00fck ve \u00e7ak\u0131\u015fmayacak bir port numaras\u0131 se\u00e7mek en iyisidir. Bilgisayar\u0131n\u0131zda ba\u015fka bir uygulaman\u0131n o portu kullanmad\u0131\u011f\u0131ndan emin olun.<\/p>\n<p><strong>S5: G\u00fcvenli soket ileti\u015fimi nas\u0131l yap\u0131l\u0131r?<\/strong><br \/>\n<strong>C5:<\/strong> G\u00fcvenli soket ileti\u015fimi i\u00e7in Java&#8217;n\u0131n <code>javax.net.ssl<\/code> paketindeki <code>SSLSocket<\/code> ve <code>SSLServerSocket<\/code> s\u0131n\u0131flar\u0131n\u0131 kullanman\u0131z gerekir. Bu s\u0131n\u0131flar, verilerin a\u011f \u00fczerinde \u015fifrelenmesini ve sunucu\/istemci kimlik do\u011frulamas\u0131n\u0131 sa\u011flayan SSL\/TLS protokollerini uygular. Bu, <code>Socket<\/code> ve <code>ServerSocket<\/code>&#8216;e g\u00f6re daha karma\u015f\u0131k bir kurulum gerektirir ancak hassas veriler i\u00e7in olmazsa olmazd\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi\n\u0130nternet ve a\u011f tabanl\u0131 uygulamalar\u0131n temelini olu\u015fturan ileti\u015fim mekanizmalar\u0131n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-37884","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi\" \/>\n<meta property=\"og:description\" content=\"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi \u0130nternet ve a\u011f tabanl\u0131 uygulamalar\u0131n temelini olu\u015fturan ileti\u015fim mekanizmalar\u0131n\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-17T16:41:29+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi\",\"datePublished\":\"2026-01-17T16:41:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\"},\"wordCount\":2017,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\",\"name\":\"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-17T16:41:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi","og_description":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi \u0130nternet ve a\u011f tabanl\u0131 uygulamalar\u0131n temelini olu\u015fturan ileti\u015fim mekanizmalar\u0131n","og_url":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-17T16:41:29+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi","datePublished":"2026-01-17T16:41:29+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/"},"wordCount":2017,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/","name":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-17T16:41:29+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-soket-programlama-kapsamli-sunucu-ve-istemci-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java Soket Programlama: Kapsaml\u0131 Sunucu ve \u0130stemci Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37884"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37884\/revisions"}],"predecessor-version":[{"id":37885,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37884\/revisions\/37885"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}