Ders İçeriği
Java, ağ üzerinden iletişim kuran uygulamalar geliştirmek için zengin bir API (Application Programming Interface) seti sunar. Bu yetenek, istemci-sunucu uygulamaları, web servisleri ve dağıtık sistemler gibi birçok modern uygulamanın temelini oluşturur. Bu bölümde, Java'da soket programlama, URL işlemleri ve HTTP bağlantıları gibi temel ağ programlama konularını inceleyeceğiz.
Temel Ağ Kavramları
- IP Adresi: Bir ağdaki her cihaza atanan benzersiz sayısal etikettir (örn. 192.168.1.1).
- Port Numarası: Bir cihaz üzerindeki belirli bir uygulamayı veya servisi tanımlayan numaradır (örn. HTTP için 80, HTTPS için 443, FTP için 21).
- Soket (Socket): Ağdaki iki program arasında iletişim kurmak için kullanılan bir uç noktadır. Bir IP adresi ve port numarasının birleşimiyle tanımlanır.
- İstemci (Client): Bir sunucuya bağlanarak hizmet talep eden program.
- Sunucu (Server): İstemcilerden gelen bağlantı isteklerini dinleyen ve hizmet sağlayan program.
Soket Programlama
Java'da soket programlama, java.net
paketi altında yer alan Socket
ve ServerSocket
sınıfları aracılığıyla yapılır.
TCP/IP Soketleri
TCP (Transmission Control Protocol), güvenilir, bağlantı odaklı bir protokoldür. Veri akışının bütünlüğünü ve sıralamasını garanti eder. Çoğu istemci-sunucu uygulaması TCP kullanır.
İstemci Tarafı (Socket
)
İstemci, bir sunucuya bağlanmak için Socket
sınıfını kullanır. Bağlantı kurulduktan sonra, sunucuya veri göndermek ve sunucudan veri almak için giriş/çıkış akışları (InputStream
, OutputStream
) kullanılır.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class SimpleClient {
public static void main(String[] args) {
String hostName = "localhost"; // Sunucunun IP adresi veya hostname
int portNumber = 12345; // Sunucunun dinlediği port
try (Socket socket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
System.out.println("Sunucuya bağlandı: " + hostName + ":" + portNumber);
// Sunucuya mesaj gönder
out.println("Merhaba Sunucu!");
System.out.println("Gönderilen: Merhaba Sunucu!");
// Sunucudan gelen cevabı oku
String response = in.readLine();
System.out.println("Sunucudan gelen: " + response);
} catch (Exception e) {
System.err.println("İstemci hatası: " + e.getMessage());
e.printStackTrace();
}
}
}
Sunucu Tarafı (ServerSocket
)
Sunucu, istemci bağlantılarını dinlemek için ServerSocket
sınıfını kullanır. Bir istemci bağlandığında, accept()
metodu yeni bir Socket
nesnesi döndürür ve bu soket üzerinden istemciyle iletişim kurulur.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
public static void main(String[] args) {
int portNumber = 12345; // Sunucunun dinleyeceği port
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
System.out.println("Sunucu " + portNumber + " portunda dinliyor...");
while (true) { // Sürekli istemci bağlantılarını dinle
Socket clientSocket = serverSocket.accept(); // İstemci bağlantısını kabul et
System.out.println("Yeni istemci bağlandı: " + clientSocket.getInetAddress().getHostAddress());
// İstemci ile iletişim için yeni bir iş parçacığı başlat (isteğe bağlı ama önerilir)
new Thread(() -> {
try (PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("İstemciden gelen: " + inputLine);
out.println("Sunucu cevabı: " + inputLine); // İstemciye geri gönder
if (inputLine.equals("bye")) {
break;
}
}
System.out.println("İstemci bağlantısı kapatıldı: " + clientSocket.getInetAddress().getHostAddress());
clientSocket.close();
} catch (Exception e) {
System.err.println("İstemci işleme hatası: " + e.getMessage());
e.printStackTrace();
}
}).start();
}
} catch (Exception e) {
System.err.println("Sunucu hatası: " + e.getMessage());
e.printStackTrace();
}
}
}
UDP Soketleri
UDP (User Datagram Protocol), bağlantısız bir protokoldür. Veri paketlerinin teslimatını veya sıralamasını garanti etmez, ancak daha hızlıdır. Genellikle oyunlar, canlı yayınlar gibi hızın güvenilirlikten daha önemli olduğu durumlarda kullanılır.
DatagramSocket
: UDP iletişimini sağlar.DatagramPacket
: Gönderilecek veya alınacak veri paketini temsil eder.
URL İşlemleri ve HTTP Bağlantıları
Java, web kaynaklarına erişmek için URL
ve URLConnection
sınıflarını sağlar. Modern uygulamalarda genellikle Apache HttpClient veya OkHttp gibi kütüphaneler tercih edilse de, temel mekanizmaları anlamak önemlidir.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class URLConnectionOrnek {
public static void main(String[] args) {
try {
URL url = new URL("https://www.example.com");
URLConnection connection = url.openConnection();
// Bağlantı ayarları (isteğe bağlı)
connection.setConnectTimeout(5000); // 5 saniye bağlantı zaman aşımı
connection.setReadTimeout(5000); // 5 saniye okuma zaman aşımı
// HTTP başlıklarını al
System.out.println("Content-Type: " + connection.getContentType());
System.out.println("Content-Length: " + connection.getContentLength());
// Web sayfasının içeriğini oku
try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
System.out.println("\nWeb sayfası içeriğinin ilk 200 karakteri:\n" + content.substring(0, Math.min(content.length(), 200)));
}
} catch (Exception e) {
System.err.println("URL bağlantı hatası: " + e.getMessage());
e.printStackTrace();
}
}
}
HttpClient
(Java 11+)
Java 11 ile birlikte gelen java.net.http
paketi, modern HTTP/2 ve WebSocket desteği ile daha güçlü ve esnek bir HTTP istemcisi sunar. Asenkron işlemleri destekler ve daha temiz bir API'ye sahiptir.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientOrnek {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.GET()
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("HTTP Durum Kodu: " + response.statusCode());
System.out.println("\nHTTP Yanıt Gövdesi:\n" + response.body());
} catch (Exception e) {
System.err.println("HTTP İstemci hatası: " + e.getMessage());
e.printStackTrace();
}
}
}
Java'da ağ programlama, uygulamaların birbirleriyle ve internetle iletişim kurmasını sağlayan temel bir yetenektir. İhtiyaçlarınıza göre soket programlama veya daha yüksek seviyeli HTTP istemcilerini kullanabilirsiniz. Bir sonraki derste JavaFX/Swing ile GUI Programlama konusunu inceleyeceğiz.