{"id":31051,"date":"2025-10-05T05:01:34","date_gmt":"2025-10-05T02:01:34","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/"},"modified":"2025-10-05T05:01:34","modified_gmt":"2025-10-05T02:01:34","slug":"node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/","title":{"rendered":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu"},"content":{"rendered":"<p><body><\/p>\n<p>Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, cihazlar ve uygulamalar aras\u0131nda s\u00fcrekli, h\u0131zl\u0131 ve g\u00fcvenilir veri ileti\u015fimi olmazsa olmaz bir ihtiya\u00e7 haline gelmi\u015ftir. Peki, bu karma\u015f\u0131k ileti\u015fimi sa\u011flayan temel yap\u0131 ta\u015flar\u0131ndan biri olan TCP sunucusu nedir ve Node.js bu alanda bize ne gibi avantajlar sunar? A\u00e7\u0131k\u00e7as\u0131, internetin en temel ileti\u015fim protokollerinden biri olan Transmission Control Protocol (TCP), veri paketlerinin do\u011fru s\u0131rayla, eksiksiz ve hatas\u0131z bir \u015fekilde iletilmesini garanti eden &#8220;ba\u011flant\u0131 tabanl\u0131&#8221; bir protokold\u00fcr. Bu \u00f6zelli\u011fi sayesinde, finansal i\u015flemlerden anl\u0131k mesajla\u015fma uygulamalar\u0131na, \u00e7ok oyunculu oyunlardan end\u00fcstriyel otomasyona kadar bir\u00e7ok kritik altyap\u0131da tercih edilir. G\u00fcvenilirli\u011fin \u00f6n planda oldu\u011fu her yerde TCP kar\u015f\u0131m\u0131za \u00e7\u0131kar.<\/p>\n<p>Node.js ise, Chrome&#8217;un V8 JavaScript motoru \u00fczerine kurulu, olay tabanl\u0131, asenkron bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu mimarisi, \u00f6zellikle y\u00fcksek e\u015fzamanl\u0131 ba\u011flant\u0131lar\u0131 ve yo\u011fun I\/O i\u015flemlerini verimli bir \u015fekilde y\u00f6netebilmesine olanak tan\u0131r. Dolay\u0131s\u0131yla, Node.js ile bir TCP sunucusu olu\u015fturmak, geli\u015ftiricilere performans ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan ciddi avantajlar sa\u011flar. \u00d6rne\u011fin, bir sunucuya ayn\u0131 anda y\u00fczlerce, hatta binlerce istemcinin ba\u011flan\u0131p veri al\u0131\u015fveri\u015finde bulundu\u011fu senaryolarda, Node.js&#8217;in olay d\u00f6ng\u00fcs\u00fc (event loop) bloklanmadan \u00e7al\u0131\u015farak t\u00fcm bu ba\u011flant\u0131lar\u0131 sorunsuz bir \u015fekilde idare edebilir. Bu da, geleneksel bloklay\u0131c\u0131 I\/O modellerine sahip di\u011fer teknolojilere g\u00f6re daha az kaynak t\u00fcketerek daha y\u00fcksek verim anlam\u0131na gelir.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda Node.js TCP sunucular\u0131n\u0131n kullan\u0131m alanlar\u0131 olduk\u00e7a geni\u015ftir. \u00d6rne\u011fin, anl\u0131k bildirim sistemleri, IoT (Nesnelerin \u0130nterneti) cihazlar\u0131ndan gelen s\u00fcrekli veri ak\u0131\u015f\u0131n\u0131 i\u015fleyen a\u011f ge\u00e7itleri, \u00e7evrimi\u00e7i oyunlarda oyuncular aras\u0131 ileti\u015fimi sa\u011flayan sunucular veya end\u00fcstriyel kontrol sistemleri bu tip sunuculara ihtiya\u00e7 duyar. Ayr\u0131ca, geleneksel HTTP tabanl\u0131 API&#8217;lerin aksine, TCP soketleri \u00fczerinden daha d\u00fc\u015f\u00fck seviyeli ve optimize edilmi\u015f protokoller (\u00f6rne\u011fin, \u00f6zel binary protokoller) kullanarak veri al\u0131\u015fveri\u015fi yapmak da m\u00fcmk\u00fcnd\u00fcr. Bu durum, \u00f6zellikle d\u00fc\u015f\u00fck gecikme s\u00fcresi ve y\u00fcksek verimlilik gerektiren uygulamalar i\u00e7in kritik \u00f6neme sahiptir. K\u0131sacas\u0131, Node.js ve TCP&#8217;nin birle\u015fimi, modern, h\u0131zl\u0131 ve g\u00fcvenilir a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir ikili olu\u015fturur. Bu makale boyunca, bu g\u00fc\u00e7l\u00fc kombinasyonu kullanarak nas\u0131l kendi sunucunuzu ad\u0131m ad\u0131m olu\u015fturabilece\u011finizi ke\u015ffedeceksiniz.<\/p>\n<h2>TCP \u0130leti\u015fiminin Temelleri: Socketler, Portlar ve El S\u0131k\u0131\u015fma S\u00fcreci Nas\u0131l \u0130\u015fler?<\/h2>\n<p>Node.js ile bir TCP sunucusu in\u015fa etmeye ba\u015flamadan \u00f6nce, temel ileti\u015fim kavramlar\u0131n\u0131 anlamak hayati \u00f6neme sahiptir. A\u011f ileti\u015fimi, bir dizi protokol ve mekanizma \u00fczerine kuruludur ve bu yap\u0131y\u0131 olu\u015fturan en temel \u00f6\u011felerden ikisi &#8220;socketler&#8221; ve &#8220;portlard\u0131r&#8221;. Bir a\u011fdaki her cihaz, bir IP adresine sahiptir; bu, cihaz\u0131n benzersiz kimli\u011fidir. Ancak bir cihaz \u00fczerinde ayn\u0131 anda bir\u00e7ok uygulama \u00e7al\u0131\u015fabilir ve her biri a\u011f \u00fczerinden veri g\u00f6ndermek veya almak isteyebilir. \u0130\u015fte bu noktada portlar devreye girer.<\/p>\n<p><strong>Portlar (Ba\u011flant\u0131 Noktalar\u0131):<\/strong> Bir port, bir bilgisayar \u00fczerindeki belirli bir uygulamay\u0131 veya hizmeti tan\u0131mlayan 0 ile 65535 aras\u0131nda de\u011fi\u015fen say\u0131sal bir etikettir. \u00d6rne\u011fin, web siteleri genellikle 80 (HTTP) veya 443 (HTTPS) portunu kullan\u0131rken, SSH ba\u011flant\u0131lar\u0131 22 numaral\u0131 portu tercih eder. Sunucunuzu dinlemeye ald\u0131\u011f\u0131n\u0131zda, asl\u0131nda belirli bir IP adresi ve port numaras\u0131 kombinasyonunu &#8220;dinlemeye&#8221; ba\u015flars\u0131n\u0131z. \u0130stemciler de ayn\u0131 IP adresi ve port numaras\u0131n\u0131 kullanarak sunucunuza ba\u011flanmaya \u00e7al\u0131\u015f\u0131r. Bu sayede, ayn\u0131 bilgisayarda birden fazla a\u011f uygulamas\u0131 sorunsuz bir \u015fekilde \u00e7al\u0131\u015fabilir, \u00e7\u00fcnk\u00fc her biri kendi port numaras\u0131 \u00fczerinden ileti\u015fim kurar. \u00d6rne\u011fin, bir web sunucusu 80 numaral\u0131 portta \u00e7al\u0131\u015f\u0131rken, ayn\u0131 anda bir sohbet sunucusu 3000 numaral\u0131 portta aktif olabilir.<\/p>\n<p><strong>Socketler (Yuvalar):<\/strong> Socket ise, iki uygulama aras\u0131nda bir a\u011f \u00fczerinden veri al\u0131\u015fveri\u015fi yapmak i\u00e7in kullan\u0131lan bir u\u00e7 noktad\u0131r. Hem sunucu hem de istemci taraf\u0131nda birer socket bulunur. Sunucu taraf\u0131nda, bir &#8220;sunucu soketi&#8221; belirli bir portu dinler ve yeni ba\u011flant\u0131 isteklerini kabul eder. Bir istemci ba\u011fland\u0131\u011f\u0131nda, sunucu yeni bir &#8220;istemci soketi&#8221; olu\u015fturur. Bu yeni soket, istemci ile sunucu aras\u0131ndaki birebir ileti\u015fim kanal\u0131n\u0131 temsil eder. Dolay\u0131s\u0131yla, bir sunucu ayn\u0131 anda birden fazla istemciyle ileti\u015fim kurabilir; her istemci i\u00e7in ayr\u0131 bir istemci soketi a\u00e7\u0131l\u0131r. Bu, e\u015fzamanl\u0131 ba\u011flant\u0131lar\u0131n nas\u0131l y\u00f6netildi\u011finin temelini olu\u015fturur. K\u0131sacas\u0131, socketler, IP adresi ve port numaras\u0131n\u0131n birle\u015fimiyle olu\u015fan mant\u0131ksal ileti\u015fim kanallar\u0131d\u0131r.<\/p>\n<p><strong>TCP El S\u0131k\u0131\u015fma (Three-Way Handshake) S\u00fcreci:<\/strong> TCP ba\u011flant\u0131s\u0131n\u0131n g\u00fcvenilirli\u011finin temelinde &#8220;\u00fc\u00e7 a\u015famal\u0131 el s\u0131k\u0131\u015fma&#8221; ad\u0131 verilen bir s\u00fcre\u00e7 yatar. Bu s\u00fcre\u00e7, istemci ve sunucunun ba\u011flant\u0131 kurmadan \u00f6nce birbirlerinin varl\u0131\u011f\u0131n\u0131 ve ileti\u015fim yeteneklerini do\u011frulamas\u0131n\u0131 sa\u011flar:<\/p>\n<ol>\n<li><strong>SYN (Senkronize):<\/strong> \u0130stemci, sunucuya bir ba\u011flant\u0131 iste\u011fi (SYN paketi) g\u00f6nderir. Bu paket, istemcinin ba\u011flant\u0131 kurmak istedi\u011fini ve ilk s\u0131ra numaras\u0131n\u0131 belirtir.<\/li>\n<li><strong>SYN-ACK (Senkronize-Onayla):<\/strong> Sunucu, ba\u011flant\u0131 iste\u011fini kabul etti\u011fini (SYN-ACK paketi) g\u00f6ndererek yan\u0131t verir. Bu paket, sunucunun kendi s\u0131ra numaras\u0131n\u0131 ve istemcinin SYN paketini ald\u0131\u011f\u0131n\u0131 onaylayan bir onay numaras\u0131 i\u00e7erir.<\/li>\n<li><strong>ACK (Onayla):<\/strong> \u0130stemci, sunucunun SYN-ACK paketini ald\u0131\u011f\u0131n\u0131 onaylayan bir ACK paketi g\u00f6nderir. Bu son onayla birlikte, TCP ba\u011flant\u0131s\u0131 ba\u015far\u0131yla kurulmu\u015f olur ve veri al\u0131\u015fveri\u015fi ba\u015flayabilir.<\/li>\n<\/ol>\n<p>    Bu s\u00fcre\u00e7, veri aktar\u0131m\u0131n\u0131n ba\u015flamadan \u00f6nce g\u00fcvenilir bir kanal\u0131n kurulmas\u0131n\u0131 garanti eder. Node.js&#8217;in <code>net<\/code> mod\u00fcl\u00fc, t\u00fcm bu karma\u015f\u0131k el s\u0131k\u0131\u015fma ve socket y\u00f6netimi s\u00fcre\u00e7lerini arka planda otomatik olarak ele al\u0131r ve geli\u015ftiricilere kullan\u0131m\u0131 kolay bir API sunar. Dolay\u0131s\u0131yla, bu temel kavramlar\u0131 anlamak, Node.js TCP sunucular\u0131n\u0131n arkas\u0131ndaki sihrin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavraman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>\u0130lk TCP Sunucunuzu Node.js ile Ad\u0131m Ad\u0131m Nas\u0131l \u0130n\u015fa Edersiniz?<\/h2>\n<p>Node.js&#8217;in g\u00fcc\u00fcnden faydalanarak kendi TCP sunucunuzu olu\u015fturmak olduk\u00e7a kolayd\u0131r. Bu b\u00f6l\u00fcmde, basit bir &#8220;echo&#8221; sunucusu \u00f6rne\u011fi \u00fczerinden ad\u0131m ad\u0131m bir TCP sunucusu nas\u0131l yaz\u0131l\u0131r, bunu inceleyece\u011fiz. Echo sunucusu, kendisine gelen her veriyi geri g\u00f6nderen basit bir yap\u0131d\u0131r ve TCP ileti\u015fiminin temel prensiplerini anlamak i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ba\u015flamadan \u00f6nce sisteminizde Node.js&#8217;in kurulu oldu\u011fundan emin olun. Kurulu de\u011filse, <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\">Node.js resmi web sitesinden<\/a> indirebilirsiniz.<\/p>\n<p>\u00d6ncelikle, yeni bir JavaScript dosyas\u0131 olu\u015ftural\u0131m, \u00f6rne\u011fin <code>server.js<\/code> ad\u0131nda.<\/p>\n<p>A\u015fa\u011f\u0131daki kodu bu dosyaya yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-javascript\">\nconst net = require('net'); \/\/ Node.js'in net mod\u00fcl\u00fcn\u00fc i\u00e7e aktar\u0131yoruz.\nconst PORT = 3000;\nconst HOST = '127.0.0.1'; \/\/ Yerel IP adresimiz\n\n\/\/ net.createServer() metodu ile bir TCP sunucusu olu\u015fturuyoruz.\nconst server = net.createServer((socket) => {\n    \/\/ 'connection' olay\u0131nda tetiklenen bir geri \u00e7a\u011f\u0131rma fonksiyonu.\n    \/\/ Her yeni ba\u011flant\u0131 i\u00e7in bir 'socket' nesnesi olu\u015fturulur.\n    console.log(<code>Yeni bir istemci ba\u011fland\u0131: ${socket.remoteAddress}:${socket.remotePort}<\/code>);\n\n    \/\/ \u0130stemciden veri geldi\u011finde tetiklenir.\n    socket.on('data', (data) => {\n        const receivedData = data.toString().trim();\n        console.log(<code>\u0130stemciden gelen veri: ${receivedData}<\/code>);\n\n        \/\/ Gelen veriyi istemciye geri g\u00f6nderiyoruz (echo).\n        socket.write(<code>Sunucudan yan\u0131t: \"${receivedData}\" al\u0131nd\u0131.\\n<\/code>);\n    });\n\n    \/\/ \u0130stemci ba\u011flant\u0131s\u0131 sona erdi\u011finde tetiklenir.\n    socket.on('end', () => {\n        console.log(<code>\u0130stemci ba\u011flant\u0131s\u0131 kesildi: ${socket.remoteAddress}:${socket.remotePort}<\/code>);\n    });\n\n    \/\/ Ba\u011flant\u0131da bir hata olu\u015ftu\u011funda tetiklenir.\n    socket.on('error', (err) => {\n        console.error(<code>Socket hatas\u0131: ${err.message}<\/code>);\n    });\n\n    \/\/ Ba\u011flant\u0131 kapanmas\u0131 tamamen ger\u00e7ekle\u015fti\u011finde tetiklenir.\n    socket.on('close', () => {\n        console.log(<code>Socket kapand\u0131: ${socket.remoteAddress}:${socket.remotePort}<\/code>);\n    });\n});\n\n\/\/ Sunucuyu belirtilen port ve host \u00fczerinde dinlemeye ba\u015fl\u0131yoruz.\nserver.listen(PORT, HOST, () => {\n    console.log(<code>Node.js TCP sunucusu ${HOST}:${PORT} adresinde dinliyor...<\/code>);\n});\n\n\/\/ Sunucuda bir hata olu\u015fursa tetiklenir.\nserver.on('error', (err) => {\n    if (err.code === 'EADDRINUSE') {\n        console.error(<code>Hata: ${PORT} portu zaten kullan\u0131mda.<\/code>);\n    } else {\n        console.error(<code>Sunucu hatas\u0131: ${err.message}<\/code>);\n    }\n    process.exit(1); \/\/ Hata durumunda uygulamay\u0131 kapat\n});\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>Kod A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<ul>\n<li><code>const net = require('net');<\/code>: Node.js'in yerle\u015fik <code>net<\/code> mod\u00fcl\u00fcn\u00fc dahil ederiz. Bu mod\u00fcl, TCP sunucular\u0131 ve istemcileri olu\u015fturmak i\u00e7in gerekli t\u00fcm i\u015flevleri sa\u011flar.<\/li>\n<li><code>net.createServer((socket) => { ... });<\/code>: Yeni bir TCP sunucusu olu\u015fturur. Callback fonksiyonu, her yeni istemci ba\u011flant\u0131s\u0131 kuruldu\u011funda otomatik olarak \u00e7a\u011fr\u0131l\u0131r ve bu ba\u011flant\u0131y\u0131 temsil eden bir <code>socket<\/code> nesnesi al\u0131r.<\/li>\n<li><code>socket<\/code> nesnesi: Bu nesne, sunucu ile belirli bir istemci aras\u0131ndaki tekil ba\u011flant\u0131y\u0131 temsil eder. \u0130stemciden veri almak, istemciye veri g\u00f6ndermek veya ba\u011flant\u0131n\u0131n durumunu izlemek i\u00e7in bu nesneyi kullan\u0131r\u0131z.<\/li>\n<li><code>socket.on('data', (data) => { ... });<\/code>: \u0130stemciden veri geldi\u011finde tetiklenen bir olay dinleyicisidir. Gelen <code>data<\/code> bir Buffer nesnesi oldu\u011fu i\u00e7in, okunabilir bir stringe d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in <code>toString()<\/code> metodu kullan\u0131l\u0131r. <code>trim()<\/code> ile ba\u015ftaki ve sondaki bo\u015fluklar (yeni sat\u0131rlar dahil) kald\u0131r\u0131l\u0131r.<\/li>\n<li><code>socket.write(data);<\/code>: Gelen veriyi (veya istedi\u011finiz herhangi bir veriyi) istemciye geri g\u00f6nderir.<\/li>\n<li><code>socket.on('end', () => { ... });<\/code>: \u0130stemcinin ba\u011flant\u0131y\u0131 sonland\u0131rd\u0131\u011f\u0131n\u0131 (genellikle istemcinin kendi taraf\u0131nda <code>socket.end()<\/code> \u00e7a\u011f\u0131rmas\u0131yla) g\u00f6steren olayd\u0131r.<\/li>\n<li><code>socket.on('error', (err) => { ... });<\/code>: Ba\u011flant\u0131 s\u0131ras\u0131nda bir hata olu\u015ftu\u011funda (\u00f6rne\u011fin, a\u011f ba\u011flant\u0131s\u0131 kesildi\u011finde) tetiklenir. Hata y\u00f6netimi, robust bir sunucu i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li><code>server.listen(PORT, HOST, () => { ... });<\/code>: Sunucuyu belirtilen port ve host \u00fczerinde dinlemeye ba\u015flat\u0131r. Sunucu ba\u015far\u0131yla dinlemeye ba\u015flad\u0131\u011f\u0131nda, callback fonksiyonu \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>server.on('error', (err) => { ... });<\/code>: Sunucunun kendisinde (t\u00fcm ba\u011flant\u0131lar\u0131 etkileyen) bir hata olu\u015ftu\u011funda tetiklenir, \u00f6rne\u011fin portun zaten ba\u015fka bir uygulama taraf\u0131ndan kullan\u0131lmas\u0131 gibi durumlar.<\/li>\n<\/ul>\n<p><strong>Sunucuyu \u00c7al\u0131\u015ft\u0131rma ve Test Etme:<\/strong><\/p>\n<p>Terminalinizi a\u00e7\u0131n, <code>server.js<\/code> dosyan\u0131z\u0131n bulundu\u011fu dizine gidin ve \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\nnode server.js\n    <\/pre>\n<p><\/code><\/p>\n<p>Terminalde \"Node.js TCP sunucusu 127.0.0.1:3000 adresinde dinliyor...\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. \u015eimdi, sunucuyu test etmek i\u00e7in bir istemciye ihtiyac\u0131m\u0131z var. Linux ve macOS sistemlerinde <code>netcat<\/code> veya <code>telnet<\/code> kullanabilirsiniz. Windows'ta da <code>telnet<\/code> (\u00f6nce etkinle\u015ftirmeniz gerekebilir) mevcuttur:<\/p>\n<pre><code class=\"language-bash\">\ntelnet 127.0.0.1 3000\n    <\/pre>\n<p><\/code><\/p>\n<p>Ba\u011fland\u0131\u011f\u0131n\u0131zda, sunucu terminalinde \"Yeni bir istemci ba\u011fland\u0131...\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. \u015eimdi telnet istemcinizden bir \u015feyler yaz\u0131p Enter tu\u015funa bas\u0131n. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-text\">\nMerhaba Node.js!\n    <\/pre>\n<p><\/code><\/p>\n<p>Telnet istemcisinde sunucudan gelen yan\u0131t\u0131 g\u00f6rmelisiniz: \"Sunucudan yan\u0131t: \"Merhaba Node.js!\" al\u0131nd\u0131.\" Sunucu terminalinde de \"\u0130stemciden gelen veri: Merhaba Node.js!\" \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6receksiniz. Bu, ilk Node.js TCP sunucunuzun ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Sunucunuzun portunu 1024'\u00fcn \u00fczerinde se\u00e7mek, i\u015fletim sistemi d\u00fczeyinde yetki sorunlar\u0131ndan ka\u00e7\u0131nman\u0131z\u0131 ve uygulaman\u0131z\u0131 daha g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar. \u00d6zellikle 80, 443 gibi iyi bilinen portlar genellikle s\u00fcper kullan\u0131c\u0131 (root) yetkisi gerektirir.<\/div>\n<h2>\u00c7oklu \u0130stemci Y\u00f6netimi: Basit Bir Sohbet Sunucusu ile Ger\u00e7ek Zamanl\u0131 \u0130leti\u015fim Nas\u0131l Kurulur?<\/h2>\n<p>Basit bir echo sunucusu olu\u015fturmak, TCP temellerini anlamak i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle birden fazla istemci aras\u0131nda etkile\u015fimi gerektirir. \u0130\u015fte bu noktada, \u00e7oklu istemci y\u00f6netimi devreye girer. Bu b\u00f6l\u00fcmde, Node.js kullanarak basit bir sohbet sunucusu \u00f6rne\u011fiyle, ayn\u0131 anda birden fazla istemcinin nas\u0131l y\u00f6netilece\u011fini ve birbirleriyle nas\u0131l ileti\u015fim kurabilece\u011fini inceleyece\u011fiz.<\/p>\n<p>Sohbet sunucumuzun temel amac\u0131, bir istemciden gelen mesaj\u0131, o anda sunucuya ba\u011fl\u0131 olan di\u011fer t\u00fcm istemcilere (g\u00f6nderen hari\u00e7) iletmektir. Bu i\u015fleme \"broadcast\" (yay\u0131n) denir. Bunu ba\u015farmak i\u00e7in, ba\u011fl\u0131 olan t\u00fcm istemci soketlerini bir yerde saklamam\u0131z ve bir mesaj geldi\u011finde bu listeyi dola\u015farak her birine mesaj\u0131 g\u00f6ndermemiz gerekecek.<\/p>\n<p>A\u015fa\u011f\u0131daki kodu <code>chatServer.js<\/code> ad\u0131nda yeni bir dosyaya kaydedelim:<\/p>\n<pre><code class=\"language-javascript\">\nconst net = require('net');\nconst PORT = 4000;\nconst HOST = '127.0.0.1';\n\nconst clients = []; \/\/ Ba\u011fl\u0131 t\u00fcm istemcilerin socketlerini tutaca\u011f\u0131m\u0131z dizi\n\nconst server = net.createServer((socket) => {\n    \/\/ Yeni ba\u011flanan istemciye benzersiz bir ID atayal\u0131m\n    socket.id = Math.random().toString(36).substring(7);\n    clients.push(socket); \/\/ \u0130stemciyi ba\u011fl\u0131lar listesine ekle\n\n    console.log(<code>Yeni bir istemci ba\u011fland\u0131: ${socket.remoteAddress}:${socket.remotePort} (ID: ${socket.id})<\/code>);\n\n    \/\/ Yeni ba\u011flant\u0131y\u0131 t\u00fcm di\u011fer istemcilere duyur\n    broadcast(<code>[Sunucu]: Yeni bir kullan\u0131c\u0131 kat\u0131ld\u0131 (ID: ${socket.id}). Toplam ${clients.length} kullan\u0131c\u0131 var.<\/code>, socket);\n\n    socket.on('data', (data) => {\n        const message = data.toString().trim();\n        console.log(<code>[${socket.id}]: ${message}<\/code>);\n\n        \/\/ Gelen mesaj\u0131 t\u00fcm ba\u011fl\u0131 istemcilere broadcast et\n        broadcast(<code>[${socket.id}]: ${message}<\/code>, socket); \/\/ G\u00f6nderen hari\u00e7\n    });\n\n    socket.on('end', () => {\n        \/\/ \u0130stemci ba\u011flant\u0131s\u0131 kesildi\u011finde listeden \u00e7\u0131kar\n        const index = clients.indexOf(socket);\n        if (index !== -1) {\n            clients.splice(index, 1);\n        }\n        console.log(<code>\u0130stemci ba\u011flant\u0131s\u0131 kesildi: ${socket.remoteAddress}:${socket.remotePort} (ID: ${socket.id})<\/code>);\n        broadcast(<code>[Sunucu]: Kullan\u0131c\u0131 ayr\u0131ld\u0131 (ID: ${socket.id}). Toplam ${clients.length} kullan\u0131c\u0131 var.<\/code>, null); \/\/ T\u00fcm herkese duyur\n    });\n\n    socket.on('error', (err) => {\n        console.error(<code>Socket hatas\u0131 (${socket.id}): ${err.message}<\/code>);\n    });\n});\n\nfunction broadcast(message, senderSocket) {\n    clients.forEach((client) => {\n        \/\/ Mesaj\u0131, g\u00f6nderen istemci hari\u00e7 herkese g\u00f6nder\n        if (client !== senderSocket) {\n            client.write(message + '\\n');\n        }\n    });\n}\n\nserver.listen(PORT, HOST, () => {\n    console.log(<code>Sohbet sunucusu ${HOST}:${PORT} adresinde dinliyor...<\/code>);\n});\n\nserver.on('error', (err) => {\n    if (err.code === 'EADDRINUSE') {\n        console.error(<code>Hata: ${PORT} portu zaten kullan\u0131mda.<\/code>);\n    } else {\n        console.error(<code>Sunucu hatas\u0131: ${err.message}<\/code>);\n    }\n    process.exit(1);\n});\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>Kod A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<ul>\n<li><code>const clients = [];<\/code>: Bu dizi, sunucuya an itibar\u0131yla ba\u011fl\u0131 olan t\u00fcm istemci socket nesnelerini tutar. Bir istemci ba\u011fland\u0131\u011f\u0131nda bu diziye eklenir, ayr\u0131ld\u0131\u011f\u0131nda ise \u00e7\u0131kar\u0131l\u0131r.<\/li>\n<li><code>socket.id = Math.random().toString(36).substring(7);<\/code>: Her yeni ba\u011flant\u0131ya benzersiz bir ID at\u0131yoruz. Bu, sunucu loglar\u0131nda ve sohbet mesajlar\u0131nda istemcileri ay\u0131rt etmek i\u00e7in faydal\u0131d\u0131r.<\/li>\n<li><code>clients.push(socket);<\/code>: Yeni ba\u011flanan istemcinin socketini <code>clients<\/code> dizisine ekleriz.<\/li>\n<li><code>broadcast(message, senderSocket)<\/code> fonksiyonu: Bu \u00f6zel fonksiyon, belirli bir mesaj\u0131 <code>clients<\/code> dizisindeki her bir sokete (iste\u011fe ba\u011fl\u0131 olarak g\u00f6nderen hari\u00e7) iletmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu, mesajlar\u0131n t\u00fcm sohbet kat\u0131l\u0131mc\u0131lar\u0131na ula\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>socket.on('end', ...)<\/code> i\u00e7inde istemcinin diziden \u00e7\u0131kar\u0131lmas\u0131: Bir istemci ba\u011flant\u0131s\u0131 sona erdi\u011finde, <code>clients<\/code> dizisinden ilgili soketi kald\u0131rmam\u0131z gerekir. Aksi takdirde, var olmayan soketlere mesaj g\u00f6ndermeye \u00e7al\u0131\u015f\u0131r ve hatalar al\u0131r\u0131z.<\/li>\n<li>Mesaj yay\u0131nlama mant\u0131\u011f\u0131: <code>socket.on('data', ...)<\/code> olay\u0131nda, gelen mesaj\u0131 al\u0131p <code>broadcast<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla g\u00f6nderen istemci hari\u00e7 t\u00fcm di\u011fer istemcilere iletiriz.<\/li>\n<\/ul>\n<p><strong>Sohbet Sunucusunu Test Etme:<\/strong><\/p>\n<ol>\n<li>\u0130lk terminalde <code>chatServer.js<\/code>'i \u00e7al\u0131\u015ft\u0131r\u0131n:\n<pre><code class=\"language-bash\">\nnode chatServer.js\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>Birden fazla terminal a\u00e7\u0131n ve her birinde sohbet sunucusuna ba\u011flan\u0131n (\u00f6rne\u011fin 3 terminal):\n<pre><code class=\"language-bash\">\ntelnet 127.0.0.1 4000\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>Her bir telnet penceresinde farkl\u0131 bir kullan\u0131c\u0131ym\u0131\u015f gibi mesajlar yaz\u0131n. Bir pencereden g\u00f6nderdi\u011finiz mesaj\u0131n, di\u011fer telnet pencerelerinde de g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc fark edeceksiniz. Ayr\u0131ca, sunucu terminalinde de her mesaj\u0131n ve ba\u011flant\u0131\/kopma olay\u0131n\u0131n logland\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/li>\n<\/ol>\n<p>Bu \u00f6rnek, Node.js'in olay tabanl\u0131 ve asenkron yap\u0131s\u0131n\u0131n, ayn\u0131 anda birden fazla ba\u011f\u0131ms\u0131z ba\u011flant\u0131y\u0131 ne kadar verimli bir \u015fekilde y\u00f6netebildi\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bir istemciden gelen veri, di\u011fer t\u00fcm istemcilere e\u015fzamanl\u0131 olarak da\u011f\u0131t\u0131l\u0131rken, sunucu bloklanmadan di\u011fer g\u00f6revlerini yerine getirmeye devam eder. Bu esneklik, ger\u00e7ek zamanl\u0131 ve etkile\u015fimli a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in Node.js'i ideal bir se\u00e7im haline getirir.<\/p>\n<h2>Performans ve \u00d6l\u00e7eklenebilirlik \u0130\u00e7in \u0130leri D\u00fczey Node.js TCP \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Basit bir TCP sunucusu kurmak kolayd\u0131r, ancak onu y\u00fcksek trafik alt\u0131nda stabil ve performansl\u0131 tutmak baz\u0131 ileri d\u00fczey yakla\u015f\u0131mlar gerektirir. Node.js'in tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131na ra\u011fmen, do\u011fru stratejilerle TCP sunucular\u0131n\u0131z\u0131 olduk\u00e7a \u00f6l\u00e7eklenebilir hale getirebilirsiniz. Bu b\u00f6l\u00fcmde, \u00f6zellikle performans art\u0131r\u0131c\u0131 ve \u00f6l\u00e7eklenebilirlik sa\u011flayan tekniklere odaklanaca\u011f\u0131z.<\/p>\n<h3>Ba\u011flant\u0131 Y\u00f6netimi ve Buffer Optimizasyonlar\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p><strong>Buffer Y\u00f6netimi:<\/strong> TCP ile veri aktar\u0131m\u0131 yaparken, veriler genellikle \"Buffer\" nesneleri olarak gelir ve g\u00f6nderilir. \u00d6zellikle b\u00fcy\u00fck dosyalar veya s\u00fcrekli veri ak\u0131\u015flar\u0131 ile \u00e7al\u0131\u015f\u0131rken, Buffer'lar\u0131n verimli kullan\u0131m\u0131 kritik \u00f6neme sahiptir. Node.js'te <code>Buffer<\/code> s\u0131n\u0131f\u0131, ikili verilerle do\u011frudan etkile\u015fime girmemizi sa\u011flar. \u00d6rne\u011fin, bir video ak\u0131\u015f\u0131 veya dosya indirme sunucusu geli\u015ftiriyorsan\u0131z, veriyi k\u00fc\u00e7\u00fck par\u00e7alara (chunka) b\u00f6lmek ve bunlar\u0131 Buffer'lar arac\u0131l\u0131\u011f\u0131yla aktarmak hem bellek kullan\u0131m\u0131n\u0131 optimize eder hem de gecikmeyi azalt\u0131r. Ayr\u0131ca, gelen verinin tamam\u0131n\u0131n tek seferde gelmeyebilece\u011fi durumlarda, gelen par\u00e7alar\u0131 birle\u015ftirerek anlaml\u0131 bir b\u00fct\u00fcn olu\u015fturmak i\u00e7in Buffer birle\u015ftirme tekniklerini kullanmak gerekir. Bu, \u00f6rne\u011fin \u00f6zel protokollerinizde mesaj s\u0131n\u0131rlar\u0131n\u0131 belirleyerek veya her mesaj\u0131n ba\u015f\u0131na uzunluk bilgisini ekleyerek yap\u0131labilir.<\/p>\n<p><strong>Keep-Alive Mekanizmalar\u0131:<\/strong> \u00d6zellikle uzun s\u00fcreli ve d\u00fc\u015f\u00fck yo\u011funluklu ba\u011flant\u0131lar i\u00e7in, TCP \"keep-alive\" mekanizmalar\u0131 faydal\u0131 olabilir. Bu mekanizmalar, belirli aral\u0131klarla k\u00fc\u00e7\u00fck paketler g\u00f6ndererek ba\u011flant\u0131n\u0131n hala aktif olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu, hem kaynaklar\u0131 (istemci veya sunucu taraf\u0131nda) bo\u015funa me\u015fgul eden \u00f6l\u00fc ba\u011flant\u0131lar\u0131n tespit edilmesine yard\u0131mc\u0131 olur hem de g\u00fcvenlik duvarlar\u0131n\u0131n bo\u015fta kalan ba\u011flant\u0131lar\u0131 kapatmas\u0131n\u0131 engeller. Node.js <code>socket<\/code> nesnesinde <code>socket.setKeepAlive(true, [initialDelay])<\/code> metodunu kullanarak bu \u00f6zelli\u011fi etkinle\u015ftirebilirsiniz.<\/p>\n<h3>Node.js Cluster Mod\u00fcl\u00fc ile \u00d6l\u00e7eklenebilirlik Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Node.js'in tek i\u015f par\u00e7ac\u0131kl\u0131 yap\u0131s\u0131, CPU yo\u011fun i\u015flemlerde performans darbo\u011fazlar\u0131na yol a\u00e7abilir. Ancak <code>cluster<\/code> mod\u00fcl\u00fc, bu s\u0131n\u0131rlaman\u0131n \u00fcstesinden gelmek i\u00e7in harika bir \u00e7\u00f6z\u00fcm sunar. <code>cluster<\/code> mod\u00fcl\u00fc, ayn\u0131 sunucu uygulamas\u0131n\u0131n birden fazla i\u015f\u00e7i s\u00fcrecini (worker process) ba\u015flatmas\u0131na olanak tan\u0131r. Her bir i\u015f\u00e7i s\u00fcreci, CPU'nun farkl\u0131 bir \u00e7ekirde\u011finde \u00e7al\u0131\u015fabilir ve ayn\u0131 sunucu portunu payla\u015fabilir. Ana s\u00fcre\u00e7 (master process), gelen ba\u011flant\u0131lar\u0131 bu i\u015f\u00e7i s\u00fcre\u00e7leri aras\u0131nda da\u011f\u0131t\u0131r (genellikle round-robin y\u00f6ntemiyle).<\/p>\n<pre><code class=\"language-javascript\">\nconst cluster = require('cluster');\nconst os = require('os');\nconst net = require('net'); \/\/ TCP sunucusu i\u00e7in\n\nconst PORT = 3000;\nconst HOST = '127.0.0.1';\n\nif (cluster.isMaster) {\n    console.log(<code>Ana s\u00fcre\u00e7 ${process.pid} \u00e7al\u0131\u015f\u0131yor<\/code>);\n    const numCPUs = os.cpus().length;\n\n    \/\/ CPU \u00e7ekirde\u011fi say\u0131s\u0131 kadar i\u015f\u00e7i s\u00fcreci ba\u015flat\n    for (let i = 0; i < numCPUs; i++) {\n        cluster.fork();\n    }\n\n    cluster.on('exit', (worker, code, signal) => {\n        console.log(<code>\u0130\u015f\u00e7i s\u00fcre\u00e7 ${worker.process.pid} \u00f6ld\u00fc. Yeni bir i\u015f\u00e7i ba\u015flat\u0131l\u0131yor...<\/code>);\n        cluster.fork(); \/\/ \u00d6len i\u015f\u00e7inin yerine yeni birini ba\u015flat\n    });\n\n} else {\n    \/\/ \u0130\u015f\u00e7i s\u00fcre\u00e7leri, TCP sunucumuzu dinlemeye ba\u015flar\n    const server = net.createServer((socket) => {\n        \/\/ TCP ba\u011flant\u0131lar\u0131n\u0131 burada i\u015fleyin\n        console.log(<code>\u0130\u015f\u00e7i ${process.pid} yeni bir istemciye hizmet veriyor.<\/code>);\n        socket.write(<code>Merhaba i\u015f\u00e7i ${process.pid}!\\n<\/code>);\n\n        socket.on('data', (data) => {\n            socket.write(<code>Gelen veri: ${data.toString()}<\/code>);\n        });\n\n        socket.on('error', (err) => console.error(<code>\u0130\u015f\u00e7i ${process.pid} socket hatas\u0131: ${err.message}<\/code>));\n    });\n\n    server.listen(PORT, HOST, () => {\n        console.log(<code>\u0130\u015f\u00e7i s\u00fcre\u00e7 ${process.pid} ${HOST}:${PORT} \u00fczerinde dinliyor.<\/code>);\n    });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131 sayesinde, bir i\u015f\u00e7i s\u00fcreci yo\u011fun bir i\u015flemle me\u015fgul olsa bile, di\u011fer i\u015f\u00e7iler yeni ba\u011flant\u0131lar\u0131 kabul etmeye ve mevcut ba\u011flant\u0131lar\u0131 i\u015flemeye devam edebilir. Bu, uygulaman\u0131z\u0131n CPU yo\u011fun g\u00f6revler alt\u0131nda bile yan\u0131t verme yetene\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ayr\u0131ca, bir i\u015f\u00e7i s\u00fcrecinin \u00e7\u00f6kmesi durumunda ana s\u00fcre\u00e7 otomatik olarak yeni bir i\u015f\u00e7i ba\u015flatarak uygulaman\u0131n genel dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 (fault tolerance) art\u0131r\u0131r.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: TCP sunucunuzda veri aktar\u0131m\u0131n\u0131 daha verimli hale getirmek i\u00e7in Buffer'lar\u0131 do\u011fru y\u00f6netmek kritik \u00f6neme sahiptir. \u00d6zellikle b\u00fcy\u00fck veri par\u00e7ac\u0131klar\u0131n\u0131 g\u00f6nderirken <code>socket.write(buffer)<\/code> yerine <code>socket.write(buffer, callback)<\/code> kullanarak verinin ba\u015far\u0131l\u0131 bir \u015fekilde g\u00f6nderildi\u011fini onaylamak, a\u011f t\u0131kan\u0131kl\u0131\u011f\u0131n\u0131 ve bellek ta\u015fmalar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olabilir. Ayr\u0131ca, <code>socket.setNoDelay(true)<\/code> ile Nagle algoritmas\u0131n\u0131 kapatarak k\u00fc\u00e7\u00fck paketlerin birle\u015fmesini engelleyebilir ve d\u00fc\u015f\u00fck gecikmeli uygulamalar i\u00e7in anl\u0131k veri g\u00f6nderimini sa\u011flayabilirsiniz.<\/div>\n<p>Ek olarak, g\u00fcvenlik de asla g\u00f6z ard\u0131 edilmemelidir. TCP sunucunuzu d\u0131\u015f d\u00fcnyaya a\u00e7t\u0131\u011f\u0131n\u0131zda, DDoS sald\u0131r\u0131lar\u0131, yetkisiz eri\u015fim denemeleri gibi tehditlere kar\u015f\u0131 haz\u0131rl\u0131kl\u0131 olmal\u0131s\u0131n\u0131z. TLS\/SSL kullanarak (<code>tls<\/code> mod\u00fcl\u00fc arac\u0131l\u0131\u011f\u0131yla) veri ileti\u015fimini \u015fifrelemek, kimlik do\u011frulama mekanizmalar\u0131 uygulamak ve gelen ba\u011flant\u0131lar\u0131n h\u0131z\u0131n\u0131 s\u0131n\u0131rlamak (rate limiting) gibi \u00f6nlemler, sunucunuzun g\u00fcvenli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/p>\n<h3>Node.js TCP Sunucusu \u0130le \u0130li\u015fkili Web Aray\u00fczlerinin Mobil Uyumlulu\u011fu Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Node.js ile geli\u015ftirilen bir TCP sunucusu do\u011frudan HTML i\u00e7eri\u011fi \u00fcretmese de, bu sunucularla etkile\u015fim kuran istemci uygulamalar\u0131 (\u00f6rne\u011fin, bir sohbet uygulamas\u0131n\u0131n web aray\u00fcz\u00fc, bir IoT cihaz\u0131 y\u00f6netim paneli veya sunucunun durumunu g\u00f6steren bir dashboard) genellikle web tabanl\u0131d\u0131r. Bu t\u00fcr web aray\u00fczlerinin mobil uyumlu (responsive) olmas\u0131, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6nem ta\u015f\u0131r. Kullan\u0131c\u0131lar, bilgisayarlar\u0131ndan, tabletlerinden veya ak\u0131ll\u0131 telefonlar\u0131ndan bu aray\u00fczlere eri\u015febilir, dolay\u0131s\u0131yla tasar\u0131m\u0131n her ekrana adapte olmas\u0131 gerekir.<\/p>\n<p>Mobil uyumlu bir web aray\u00fcz\u00fc tasarlarken, CSS Media Queries (medya sorgular\u0131) en temel ara\u00e7lardan biridir. Medya sorgular\u0131, ekran boyutu, cihaz tipi, y\u00f6nlendirme (yatay\/dikey) gibi \u00f6zelliklere g\u00f6re farkl\u0131 CSS kurallar\u0131n\u0131n uygulanmas\u0131n\u0131 sa\u011flar. Bu sayede, ayn\u0131 HTML yap\u0131s\u0131yla farkl\u0131 cihazlarda optimize edilmi\u015f bir g\u00f6r\u00fcn\u00fcm sunabilirsiniz. \u00d6rne\u011fin, bir sohbet uygulamas\u0131n\u0131n web aray\u00fcz\u00fcnde, masa\u00fcst\u00fcnde geni\u015f bir sohbet penceresi ve kenar \u00e7ubu\u011fu varken, mobil cihazlarda kenar \u00e7ubu\u011funu gizleyip sohbet penceresini tam geni\u015flikte g\u00f6sterebilirsiniz.<\/p>\n<p><strong>Mobil Uyumlu Bir Web Aray\u00fcz\u00fc i\u00e7in Temel HTML ve CSS \u00d6rne\u011fi:<\/strong><\/p>\n<p>Farz edelim ki TCP sunucunuzla WebSocket (TCP \u00fczerine kurulu, taray\u0131c\u0131 uyumlu bir protokol) \u00fczerinden ileti\u015fim kuran basit bir web sohbet aray\u00fcz\u00fc olu\u015fturuyorsunuz. Bu aray\u00fcz i\u00e7in responsive tasar\u0131m a\u015fa\u011f\u0131daki gibi olabilir:<\/p>\n<pre><code class=\"language-html\">\n<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mobil Uyumlu Sohbet Aray\u00fcz\u00fc<\/title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n<\/head>\n<body>\n    <div class=\"chat-container\">\n        <div class=\"sidebar\">\n            <h3>Online Kullan\u0131c\u0131lar<\/h3>\n            <ul id=\"user-list\">\n                <!-- Kullan\u0131c\u0131lar buraya eklenecek -->\n            <\/ul>\n        <\/div>\n        <div class=\"chat-window\">\n            <div id=\"messages\" class=\"messages\">\n                <!-- Mesajlar buraya eklenecek -->\n            <\/div>\n            <input type=\"text\" id=\"message-input\" placeholder=\"Mesaj\u0131n\u0131z\u0131 yaz\u0131n...\">\n            <button id=\"send-button\">G\u00f6nder<\/button>\n        <\/div>\n    <\/div>\n    <script src=\"client.js\"><\/script> <!-- WebSocket veya API istemcisi -->\n<\/body>\n<\/html>\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-css\"><\/pre>\n<p><\/code><br \/>\n\/* style.css *\/<br \/>\nbody {<br \/>\n    font-family: Arial, sans-serif;<br \/>\n    margin: 0;<br \/>\n    padding: 0;<br \/>\n    background-color: #f4f4f4;<br \/>\n    display: flex;<br \/>\n    justify-content: center;<br \/>\n    align-items: center;<br \/>\n    min-height: 100vh;<br \/>\n}<\/p>\n<p>.chat-container {<br \/>\n    display: flex;<br \/>\n    width: 90%;<br \/>\n    max-width: 1200px;<br \/>\n    background-color: #fff;<br \/>\n    box-shadow: 0 0 10px rgba(0,0,0,0.1);<br \/>\n    border-radius: 8px;<br \/>\n    overflow: hidden;<br \/>\n}<\/p>\n<p>.sidebar {<br \/>\n    width: 25%;<br \/>\n    background-color: #eee;<br \/>\n    padding: 20px;<br \/>\n    border-right: 1px solid #ddd;<br \/>\n}<\/p>\n<p>.chat-window {<br \/>\n    flex-grow: 1;<br \/>\n    padding: 20px;<br \/>\n    display: flex;<br \/>\n    flex-direction: column;<br \/>\n}<\/p>\n<p>.messages {<br \/>\n    flex-grow: 1;<br \/>\n    overflow-y: auto;<br \/>\n    border: 1px solid #eee;<br \/>\n    padding: 10px;<br \/>\n    margin-bottom: 10px;<br \/>\n    border-radius: 4px;<br \/>\n    background-color: #fafafa;<br \/>\n}<\/p>\n<p>#message-input {<br \/>\n    width: calc(100% - 70px);<br \/>\n    padding: 10px;<br \/>\n    border: 1px solid #ddd;<br \/>\n    border-radius: 4px;<br \/>\n    margin-right: 10px;<br \/>\n}<\/p>\n<p>#send-button {<br \/>\n    padding: 10px 15px;<br \/>\n    background-color: #007bff;<br \/>\n    color: white;<br \/>\n    border: none;<br \/>\n    border-radius: 4px;<br \/>\n    cursor: pointer;<br \/>\n}<\/p>\n<p>\/* Mobil uyumluluk i\u00e7in medya sorgular\u0131 *\/<br \/>\n@media (max-width: 768px) {<br \/>\n    .chat-container {<br \/>\n        flex-direction: column;<br \/>\n        width: 100%;<br \/>\n        height: 100vh;<br \/>\n        border-radius: 0;<br \/>\n    }<\/p>\n<p>    .sidebar {<br \/>\n        width: 100%;<br \/>\n        border-right: none;<br \/>\n        border-bottom: 1px solid #ddd;<br \/>\n        padding: 10px;<br \/>\n        height: 100px; \/* Mobil g\u00f6r\u00fcn\u00fcmde daha k\u00fc\u00e7\u00fck *\/<br \/>\n        overflow-y: auto;<br \/>\n    }<\/p>\n<p>    .chat-window {<br \/>\n        padding: 10px;<br \/>\n        flex-grow: 1; \/* Mesaj penceresi daha fazla yer kaplar *\/<br \/>\n    }<\/p>\n<p>    #message-input {<br \/>\n        width: calc(100% - 90px); \/* Buton i\u00e7in daha fazla yer *\/<br \/>\n    }<br \/>\n}<\/p>\n<p>@media (max-width: 480px) {<br \/>\n    .sidebar h3 {<br \/>\n        font-size: 1em;<br \/>\n    }<br \/>\n    #user-list li {<br \/>\n        font-size: 0.9em;<br \/>\n    }<br \/>\n}<br \/>\n    <\/code><\/p>\n<p>Bu \u00f6rnekte, <code>@media (max-width: 768px)<\/code> ve <code>@media (max-width: 480px)<\/code> medya sorgular\u0131 kullan\u0131larak, ekran geni\u015fli\u011fi belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde aray\u00fcz\u00fcn d\u00fczeni (<code>flex-direction: column<\/code>) ve \u00f6\u011felerin boyutlar\u0131 de\u011fi\u015ftirilir. Bu sayede, web tabanl\u0131 istemciniz Node.js TCP sunucusuyla ileti\u015fim kurarken, kullan\u0131c\u0131lar da herhangi bir cihazda sorunsuz bir deneyim ya\u015fayabilirler. K\u0131sacas\u0131, Node.js TCP sunucunuzun kendisi do\u011frudan HTML \u00fcretmese de, onunla etkile\u015fim kuran her t\u00fcrl\u00fc \u00f6n y\u00fcz uygulamas\u0131n\u0131n mobil uyumlu olmas\u0131, modern web geli\u015ftirme pratiklerinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r.<\/p>\n<h2>\u00d6zet ve S\u0131k\u00e7a Sorulan Sorular: TCP Sunucular\u0131 Hakk\u0131nda Bilmeniz Gerekenler<\/h2>\n<p>Bu makalede, Node.js kullanarak basit bir TCP sunucusu olu\u015fturman\u0131n temel ad\u0131mlar\u0131n\u0131, underlying kavramlar\u0131 ve ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak ele ald\u0131k. Node.js'in asenkron ve olay tabanl\u0131 mimarisinin, ger\u00e7ek zamanl\u0131 ve y\u00fcksek performansl\u0131 a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in ne kadar uygun oldu\u011funu g\u00f6rd\u00fck. Ayr\u0131ca, socketlerin ve portlar\u0131n ileti\u015fimdeki rol\u00fcn\u00fc, TCP'nin g\u00fcvenilir el s\u0131k\u0131\u015fma s\u00fcrecini ve \u00e7oklu istemci y\u00f6netiminin nas\u0131l ger\u00e7ekle\u015ftirilece\u011fini de ke\u015ffettik. \u00d6zellikle <code>net<\/code> mod\u00fcl\u00fc sayesinde, karma\u015f\u0131k a\u011f i\u015flemlerini basit JavaScript kodlar\u0131yla y\u00f6netebilme yetene\u011fi, Node.js'i bu alanda g\u00fc\u00e7l\u00fc bir ara\u00e7 haline getirmektedir.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, Node.js TCP sunucular\u0131n\u0131n sohbet uygulamalar\u0131ndan IoT veri toplama merkezlerine kadar geni\u015f bir yelpazede kullan\u0131labilece\u011fini anlad\u0131k. Performans\u0131 art\u0131rmak i\u00e7in Buffer y\u00f6netimi ve \u00f6l\u00e7eklenebilirlik i\u00e7in <code>cluster<\/code> mod\u00fcl\u00fc gibi ileri d\u00fczey tekniklerin \u00f6nemine de\u011findik. Son olarak, TCP sunucusunun kendisi HTML \u00fcretmese de, onunla etkile\u015fim kuran web tabanl\u0131 istemci aray\u00fczlerinin mobil uyumlu olmas\u0131n\u0131n, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan ne kadar kritik oldu\u011funu ve bunun medya sorgular\u0131 gibi CSS teknikleriyle nas\u0131l sa\u011flanabilece\u011fini g\u00f6sterdik. Node.js TCP sunucular\u0131yla \u00e7al\u0131\u015fmak, size a\u011f programlamas\u0131nda derin bir anlay\u0131\u015f kazand\u0131racak ve bir sonraki ger\u00e7ek zamanl\u0131 projenizde g\u00fc\u00e7l\u00fc bir temel olu\u015fturacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>Soru 1: TCP ve UDP aras\u0131ndaki temel fark nedir?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> TCP (Transmission Control Protocol), ba\u011flant\u0131 tabanl\u0131 ve g\u00fcvenilir bir protokold\u00fcr. Veri paketlerinin s\u0131ras\u0131n\u0131, b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve eksiksiz teslimat\u0131n\u0131 garanti eder; kaybolan paketleri yeniden g\u00f6nderir. Bu nedenle finansal i\u015flemler, web trafi\u011fi gibi veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fcn kritik oldu\u011fu yerlerde kullan\u0131l\u0131r. UDP (User Datagram Protocol) ise ba\u011flant\u0131s\u0131z ve g\u00fcvenilmez bir protokold\u00fcr. Daha h\u0131zl\u0131d\u0131r \u00e7\u00fcnk\u00fc paketlerin s\u0131ras\u0131 veya teslimat garantisi vermez. Ger\u00e7ek zamanl\u0131 oyunlar, canl\u0131 yay\u0131nlar gibi h\u0131z\u0131n \u00f6ncelikli oldu\u011fu ve k\u00fc\u00e7\u00fck veri kay\u0131plar\u0131n\u0131n tolere edilebildi\u011fi uygulamalarda tercih edilir.<\/dd>\n<dt><strong>Soru 2: Node.js TCP sunucusu hangi t\u00fcr uygulamalar i\u00e7in idealdir?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> Node.js TCP sunucular\u0131, \u00f6zellikle ger\u00e7ek zamanl\u0131, d\u00fc\u015f\u00fck gecikmeli ve y\u00fcksek e\u015fzamanl\u0131 ba\u011flant\u0131lar gerektiren uygulamalar i\u00e7in idealdir. Bunlara anl\u0131k sohbet uygulamalar\u0131, \u00e7ok oyunculu \u00e7evrimi\u00e7i oyun sunucular\u0131 (\u00f6zellikle oyun i\u00e7i mesajla\u015fma ve durum g\u00fcncellemeleri), Nesnelerin \u0130nterneti (IoT) cihazlar\u0131ndan veri toplama a\u011f ge\u00e7itleri, end\u00fcstriyel kontrol sistemleri ve \u00f6zel ikili protokoller \u00fczerinden ileti\u015fim kuran servisler dahildir.<\/dd>\n<dt><strong>Soru 3: B\u00fcy\u00fck veri aktar\u0131mlar\u0131nda performans\u0131 nas\u0131l art\u0131rabilirim?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> B\u00fcy\u00fck veri aktar\u0131mlar\u0131nda performans\u0131 art\u0131rmak i\u00e7in birka\u00e7 yol vard\u0131r:<\/p>\n<ul>\n<li><strong>Buffer Y\u00f6netimi:<\/strong> Verileri k\u00fc\u00e7\u00fck Buffer par\u00e7ac\u0131klar\u0131na b\u00f6lerek (<code>chunking<\/code>) ve bu par\u00e7alar\u0131 kademeli olarak g\u00f6ndermek, bellek kullan\u0131m\u0131n\u0131 optimize eder.<\/li>\n<li><strong>Ak\u0131\u015flar (Streams):<\/strong> Node.js'in ak\u0131\u015f (stream) API'lerini kullanmak, verileri belle\u011fe tamamen y\u00fcklemeden par\u00e7a par\u00e7a i\u015fleyip iletmeyi sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck dosyalarla \u00e7al\u0131\u015f\u0131rken etkilidir.<\/li>\n<li><strong>Nagle Algoritmas\u0131:<\/strong> <code>socket.setNoDelay(true)<\/code> ile Nagle algoritmas\u0131n\u0131 kapatmak, k\u00fc\u00e7\u00fck veri paketlerinin birle\u015fmesini engelleyerek gecikmeyi azaltabilir, ancak a\u011f trafi\u011fini art\u0131rabilir.<\/li>\n<li><strong>S\u0131k\u0131\u015ft\u0131rma:<\/strong> G\u00f6ndermeden \u00f6nce verileri s\u0131k\u0131\u015ft\u0131rmak (\u00f6rne\u011fin Gzip ile), aktar\u0131lacak veri miktar\u0131n\u0131 azalt\u0131r ve bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 optimize eder.<\/li>\n<\/ul>\n<\/dd>\n<dt><strong>Soru 4: TCP sunucumu g\u00fcvenli hale getirmek i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> TCP sunucunuzu g\u00fcvenli hale getirmek i\u00e7in:<\/p>\n<ul>\n<li><strong>TLS\/SSL Kullan\u0131m\u0131:<\/strong> Node.js'in <code>tls<\/code> mod\u00fcl\u00fcn\u00fc kullanarak ileti\u015fim kanallar\u0131n\u0131 \u015fifreleyin. Bu, veri gizlili\u011fini ve b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flar (\u00f6rne\u011fin, FTPS, SMTPS gibi).<\/li>\n<li><strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong> Ba\u011flanan istemcilerin kimli\u011fini do\u011frulay\u0131n ve yaln\u0131zca yetkili kullan\u0131c\u0131lar\u0131n belirli i\u015flemleri yapmas\u0131na izin verin.<\/li>\n<li><strong>Giri\u015f Do\u011frulama:<\/strong> \u0130stemciden gelen t\u00fcm verileri dikkatlice do\u011frulay\u0131n ve temizleyin (sanitize). Enjeksiyon sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in asla do\u011frudan gelen veriyi kullanmay\u0131n.<\/li>\n<li><strong>Rate Limiting (H\u0131z S\u0131n\u0131rlama):<\/strong> Bir IP adresinden veya istemciden gelen ba\u011flant\u0131 ve veri miktar\u0131n\u0131 s\u0131n\u0131rlayarak DDoS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flay\u0131n.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> G\u00fcvenli ve bilgilendirici hata mesajlar\u0131 sa\u011flay\u0131n, ancak hassas bilgileri a\u00e7\u0131\u011fa \u00e7\u0131karmay\u0131n.<\/li>\n<\/ul>\n<\/dd>\n<dt><strong>Soru 5: Ayn\u0131 anda ka\u00e7 istemciyi destekleyebilirim?<\/strong><\/dt>\n<dd><strong>Cevap:<\/strong> Node.js TCP sunucunuzun ayn\u0131 anda destekleyebilece\u011fi istemci say\u0131s\u0131, sunucunuzun donan\u0131m kaynaklar\u0131na (CPU, RAM, a\u011f bant geni\u015fli\u011fi), uygulaman\u0131z\u0131n yapt\u0131\u011f\u0131 i\u015flem yo\u011funlu\u011funa (I\/O vs. CPU), i\u015fletim sisteminin a\u00e7\u0131k dosya limiti gibi fakt\u00f6rlere ba\u011fl\u0131d\u0131r. Node.js, asenkron I\/O yap\u0131s\u0131 sayesinde binlerce hatta on binlerce e\u015fzamanl\u0131 ba\u011flant\u0131y\u0131 tek bir i\u015flemde verimli bir \u015fekilde y\u00f6netebilir. Ancak CPU yo\u011fun i\u015flemler yap\u0131l\u0131yorsa, Node.js <code>cluster<\/code> mod\u00fcl\u00fc ile birden fazla i\u015f\u00e7i s\u00fcreci ba\u015flatmak, CPU \u00e7ekirdeklerinden tam kapasite faydalanarak bu say\u0131y\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Genellikle, iyi optimize edilmi\u015f bir Node.js TCP sunucusu, uygun donan\u0131m ve tasar\u0131mla y\u00fcz binlerce e\u015fzamanl\u0131 ba\u011flant\u0131y\u0131 kald\u0131rabilir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara&hellip;","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":[136],"tags":[],"class_list":{"0":"post-31051","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu<\/title>\n<meta name=\"description\" content=\"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.\" \/>\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\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu\" \/>\n<meta property=\"og:description\" content=\"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-05T02:01:34+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu\",\"datePublished\":\"2025-10-05T02:01:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\"},\"wordCount\":4330,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\",\"name\":\"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-05T02:01:34+00:00\",\"description\":\"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu\"}]},{\"@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":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu","description":"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.","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\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu","og_description":"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-05T02:01:34+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu","datePublished":"2025-10-05T02:01:34+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/"},"wordCount":4330,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/","name":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-05T02:01:34+00:00","description":"Node.js kullanarak h\u0131zl\u0131 ve g\u00fcvenilir bir TCP sunucusu nas\u0131l olu\u015fturulur? Bu kapsaml\u0131 rehberde, temel kavramlardan ileri seviye uygulamalara kadar ad\u0131m ad\u0131m ilerleyecek, ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 inceleyecek ve kendi Node.js TCP sunucunuzu hayata ge\u00e7ireceksiniz. Modern uygulamalar\u0131n vazge\u00e7ilmezi olan ger\u00e7ek zamanl\u0131 veri ileti\u015fiminin kap\u0131lar\u0131n\u0131 aralay\u0131n.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-basit-bir-tcp-sunucusu-olusturma-kilavuzu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js ile Basit Bir TCP Sunucusu Olu\u015fturma K\u0131lavuzu"}]},{"@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\/31051","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=31051"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31051\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}