Java'nın Socket API'sini kullanarak sıfırdan oluşturulmuş, herhangi bir üçüncü taraf kütüphane veya framework kullanmayan hafif bir HTTP web sunucusu.
Bu proje, aşağıdaki özelliklere sahip basit bir web sunucusu oluşturarak ağ programlamanın temellerini göstermektedir:
- 1989 portunu dinler
- Web tarayıcılarından gelen HTTP isteklerini kabul eder
- Öğrenci bilgilerini içeren stillendirilmiş bir HTML sayfası ile yanıt verir
- Yalnızca Java'nın yerleşik ağ kütüphanelerini kullanır
- ✅ Saf Java implementasyonu (harici bağımlılık yok)
- ✅ Socket tabanlı TCP/IP iletişimi
- ✅ HTTP/1.1 protokol desteği
- ✅ CSS stillendirmeli özel HTML yanıtı
- ✅ Birden fazla sıralı istemci bağlantısını işler
- ✅ Hata ayıklama için konsol günlüğü
- Socket: Ağ iletişimi için bir uç nokta (IP Adresi + Port Numarası)
- ServerSocket: Belirli bir portta gelen istemci bağlantılarını dinler
- ClientSocket: Bir istemciyle aktif bağlantıyı temsil eder
- Ağdaki cihazlar için benzersiz tanımlayıcı
- Örnek:
127.0.0.1(localhost - kendi bilgisayarınız)
- Bir IP adresinde numaralı bir ağ geçidi (0-65535)
- Bu projede 1989 portu kullanılır
- Bir binadaki (IP adresi) daire numarası gibi düşünülebilir
| Sınıf | Amaç |
|---|---|
ServerSocket |
1989 portunda dinleyen bir sunucu oluşturur |
Socket |
İstemci ve sunucu arasındaki bağlantıyı temsil eder |
BufferedReader |
İstemciden gelen HTTP isteğini verimli şekilde okur |
BufferedWriter |
İstemciye HTTP yanıtını verimli şekilde gönderir |
InputStreamReader |
Bayt akışını karakter akışına dönüştürür (giriş) |
OutputStreamWriter |
Karakter akışını bayt akışına dönüştürür (çıkış) |
SimpleWebServer.java
├── main() # Giriş noktası - sunucuyu başlatır
└── handleClient() # Bireysel istemci isteklerini işler
- Java Development Kit (JDK) 8 veya üzeri
- Herhangi bir metin editörü veya IDE
- Web tarayıcı (Chrome, Firefox, Safari, vb.)
- Kodu derleyin:
javac SimpleWebServer.java- Sunucuyu çalıştırın:
java SimpleWebServer- Tarayıcınızı açın:
http://localhost:1989
Konsol:
Server started on port 1989
Open http://localhost:1989 in your browser.
Request: GET / HTTP/1.1
Tarayıcı:
- Mor renkli H1 başlığında öğrenci adı
- Pembe renkli H2 başlığında öğrenci numarası
- Stillendirilmiş içerikli biyografi bölümü
1. Sunucu Başlatma
└─> 1989 portunda ServerSocket oluşturulur
└─> Sunucu dinleme moduna geçer
2. İstemci Bağlantısı
└─> Tarayıcı localhost:1989'a HTTP isteği gönderir
└─> accept() metodu bağlantıyı kabul eder
└─> Bu istemci için yeni Socket nesnesi oluşturulur
3. İstek İşleme
└─> BufferedReader HTTP istek satırını okur
└─> İstek konsola kaydedilir
└─> HTML yanıtı hazırlanır
4. Yanıt Gönderme
└─> HTTP durum satırı gönderilir (200 OK)
└─> HTTP başlıkları gönderilir (Content-Type, Content-Length)
└─> Boş ayırıcı satır gönderilir
└─> HTML içeriği gönderilir
5. Bağlantı Temizleme
└─> Çıkış temizlenir (flush)
└─> İstemci soketi kapatılır
└─> Sunucu bir sonraki bağlantı için hazır olur
GET / HTTP/1.1
Host: localhost:1989
User-Agent: Mozilla/5.0
Accept: text/htmlHTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<!DOCTYPE html>
<html>
...
</html>Sunulan web sayfası şunları içerir:
- Times New Roman yazı tipi ailesi
- Mor (#9370DB) H1 başlığı
- Pembe (#FFC0CB) H2 başlığı
- CSS ile duyarlı stillendirme
- Kutu gölgesi ve yuvarlatılmış köşe efektleri
- Temiz, modern düzen
-
Çoklu bağlantılar:
- Tarayıcıyı birkaç kez yenileyin
- Her istek konsolda günlüğe kaydedilir
-
Farklı tarayıcılar:
- Chrome:
http://localhost:1989 - Firefox:
http://localhost:1989 - Safari:
http://localhost:1989
- Chrome:
-
Ağ erişimi:
- IP'nizi bulun:
ipconfig(Windows) veyaifconfig(Mac/Linux) - Başka bir cihazdan erişin:
http://IP_ADRESINIZ:1989
- IP'nizi bulun:
Port Zaten Kullanımda:
java.net.BindException: Address already in use
Çözüm: Port numarasını değiştirin veya 1989 portunu kullanan işlemi sonlandırın
Tarayıcı "Bağlantı Reddedildi" Gösteriyor:
- Sunucunun çalıştığını doğrulayın
- Güvenlik duvarı ayarlarını kontrol edin
- Doğru URL'yi kullandığınızdan emin olun:
http://localhost:1989
Türkçe Karakterler Görüntülenmiyor:
- InputStreamReader/OutputStreamReader'da UTF-8 kodlamasını kullandığınızdan emin olun
- HTML'ye
<meta charset="UTF-8">ekleyin
Bu kodu inceledikten sonra şunları anlamalısınız:
- ✅ TCP/IP soketleri nasıl çalışır
- ✅ Sunucu-istemci iletişim modeli
- ✅ HTTP protokolü temelleri (istek/yanıt döngüsü)
- ✅ Java G/Ç akışları (Giriş/Çıkış)
- ✅ Ağ programlama temelleri
- ✅ Otomatik kaynak yönetimi için try-with-resources
Bu proje şunlar için tasarlanmıştır:
- Ağ programlama öğrenen Bilgisayar Bilimleri öğrencileri
- İstemci-sunucu mimarisini anlama
- HTTP protokolü temellerini öğrenme
- Socket programlama pratiği
- Web sunucusu uygulama konseptleri
Kod, şunları açıklayan ayrıntılı Türkçe yorumlar içerir:
- Socket kavramları
- Port ve IP adresi
- HTTP protokolü
- Giriş/Çıkış akışları
- Bağlantı yönetimi
- Tek iş parçacıklı: Aynı anda bir istemciyi işler
- HTTPS yok: Yalnızca düz HTTP (SSL/TLS yok)
- Statik içerik: Dinamik sayfa oluşturma yok
- Temel hata işleme: Minimum istisna yönetimi
- Yönlendirme yok: Tüm istekler için aynı sayfayı sunar
- Çoklu iş parçacığı: Birden fazla istemciyi aynı anda işleyin
- Yönlendirme: URL yoluna göre farklı sayfalar sunun
- Dosya sunma: HTML dosyalarını diskten sunun
- POST desteği: Form gönderimlerini işleyin
- Günlük kaydı: Günlükleri dosyaya yazın
- Yapılandırma: Portu yapılandırma dosyasından okuyun
- Ad: Milda Lestari Hida Nurfitri
- Öğrenci No: 5240505062
- Üniversite: Kırklareli Üniversitesi
- Ders: Ağ Programlama / Socket Programlama
Bu, akademik amaçlar için hazırlanmış bir eğitim projesidir.
Bu bir öğrenci projesidir. Kendi değişikliklerinizle denemeler yapmak için çatallayabilirsiniz!
Kod hakkında sorular için:
- Satır içi yorumları inceleyin
- Java Socket API dokümantasyonunu çalışın
- HTTP/1.1 protokol temellerini anlayın
- Farklı port numaraları ve HTML içeriğiyle pratik yapın
☕ Java ile Yapıldı | Port 1989 | Saf Socket Programlama
ServerSocket(port)- Belirtilen portta sunucu oluştururaccept()- İstemci bağlantısını bekler ve kabul eder (bloklar)getInputStream()- Soketten giriş akışını alırgetOutputStream()- Sokete çıkış akışını alırreadLine()- Girişten bir satır okurwrite()- Çıkışa veri yazarflush()- Tüm verilerin gönderildiğinden emin olurclose()- Soket bağlantısını kapatır
200 OK- İstek başarılı404 Not Found- Kaynak bulunamadı500 Internal Server Error- Sunucu hatası