Aplikasi Java jarang berdiri sendiri. Backend memanggil layanan lain, aplikasi mobile mengunduh data dari API, dan sistem perusahaan bertukar pesan antar server setiap detik. Semua aktivitas tersebut berjalan di atas konsep yang sama: alamat IP mengidentifikasi mesin, port mengidentifikasi aplikasi di dalam mesin, dan protokol menentukan aturan percakapan. Keluarga API networking Java — java.net, java.net.http, hingga javax.net.ssl — menyembunyikan detail sistem operasi, tetapi tetap menuntut kita memahami fondasinya agar bisa mendesain komunikasi yang benar. Chapter ini memetakan model jaringan, alamat, port, serta perbedaan TCP dan UDP sebelum kita menyentuh satu baris kode socket.
Lapisan Jaringan dan Protokol #
Model referensi OSI membagi komunikasi menjadi tujuh lapisan, sementara implementasi internet nyata mengikuti model TCP/IP yang lebih ringkas. Kita tidak perlu menghafal keduanya secara detail; cukup pahami pembagian tanggung jawab berikut karena API Java bekerja tepat di lapisan tersebut.
| Lapisan | Contoh Protokol | Peran di Java |
|---|---|---|
| Application | HTTP, HTTPS, DNS | HttpClient, HttpsServer |
| Transport | TCP, UDP | Socket, ServerSocket, DatagramSocket |
| Internet | IP, ICMP | ditangani JVM dan sistem operasi |
| Link | Ethernet, Wi-Fi | di luar jangkauan Java |
Kode Java yang kita tulis hampir selalu berada di lapisan application dan transport. Ketika kita membuat objek Socket, JVM meminta sistem operasi membuka soket TCP; ketika kita memakai HttpClient, pustaka standar menyusun pesan HTTP lalu menyerahkannya ke lapisan transport. Pemahaman posisi ini membantu kita menebak di mana masalah berada: kegagalan koneksi biasanya terjadi di lapisan transport, sedangkan respons tidak terduga berada di lapisan application.
Alamat IP, Port, dan DNS #
Alamat IP adalah nomor unik sebuah antarmuka jaringan. IPv4 ditulis empat bilangan seperti 192.168.1.10, sedangkan IPv6 memakai format heksadesimal seperti 2001:db8::1. Class InetAddress merepresentasikan keduanya dan menyediakan pencarian nama lewat DNS — layanan yang menerjemahkan example.com menjadi alamat IP.
Satu mesin dapat menjalankan banyak program sekaligus, sehingga alamat IP saja tidak cukup. Port (0 sampai 65535) menjadi nomor pintu yang membedakan aplikasi: server web mendengarkan port 80 atau 443, sementara database PostgreSQL lazimnya memakai port 5432. Kombinasi alamat dan port — misalnya 192.168.1.10:8080 — disebut socket address dan menjadi alamat lengkap sebuah titik komunikasi.
Mari kita periksa alamat paling penting bagi pengembangan lokal, yaitu loopback:
import java.net.InetAddress;
public class PetaAlamat {
public static void main(String[] args) throws Exception {
// Alamat loopback tersedia tanpa menyentuh jaringan nyata
InetAddress loopback = InetAddress.getLoopbackAddress();
System.out.println("hostAddress loopback : " + loopback.getHostAddress());
System.out.println("isLoopbackAddress : " + loopback.isLoopbackAddress());
// Nama "localhost" diselesaikan lewat berkas hosts sistem operasi
InetAddress lokal = InetAddress.getByName("localhost");
System.out.println("getHostName : " + lokal.getHostName());
System.out.println("hostAddress localhost : " + lokal.getHostAddress());
}
}Output yang Dihasilkan:
hostAddress loopback : 127.0.0.1
isLoopbackAddress : true
getHostName : localhost
hostAddress localhost : 127.0.0.1Mari kita telaah baris-baris kode di atas:
- Baris 6 (
InetAddress loopback = InetAddress.getLoopbackAddress();): mengembalikan alamat loopback tanpa melakukan pencarian DNS, sehingga pemanggilan method ini cepat dan tidak pernah menyentuh jaringan nyata. - Baris 7-8 (
loopback.getHostAddress()danisLoopbackAddress()):getHostAddress()mengembalikan teks alamat IP, sedangkanisLoopbackAddress()memeriksa apakah alamat berada di rentang loopback (IPv4127.0.0.0/8). - Baris 11 (
InetAddress.getByName("localhost")): menerjemahkan namalocalhostmenjadi alamat. Penerjemahan ini membaca berkashostsmilik sistem operasi sebelum bertanya ke DNS. - Baris 12-13:
getHostName()mengembalikan nama yang diketahui untuk alamat tersebut, dan hasilnya tetaplocalhostkarena pencarian nama dan alamat berasal dari sumber yang sama.
Loopback dan Port Ephemeral #
Alamat 127.0.0.1 (IPv4) dan ::1 (IPv6) merujuk ke mesin sendiri — inilah loopback. Paket yang dikirim ke loopback tidak pernah meninggalkan mesin, sehingga loopback menjadi tempat ideal menguji program client dan server dalam satu komputer. Seluruh contoh runnable pada Section ini memakai loopback agar hasilnya dapat diverifikasi tanpa jaringan eksternal.
Setiap klien yang terhubung juga butuh port miliknya. Jika kita tidak menentukan port, sistem operasi memilih angka acak pada rentang ephemeral — biasanya 49152 sampai 65535 — lalu melepaskannya setelah koneksi ditutup. Konsekuensi praktisnya: nomor port klien tidak dapat diprediksi, jadi jangan pernah meng-hardcode port klien. Program berikut memetakan kategori port:
public class KategoriPort {
static String kategori(int port) {
if (port < 0 || port > 65535) {
return "tidak valid";
}
if (port == 0) {
return "ephemeral (dipilih sistem)";
}
if (port < 1024) {
return "well-known";
}
if (port < 49152) {
return "registered";
}
return "dynamic/ephemeral";
}
public static void main(String[] args) {
int[] contoh = {80, 443, 8080, 0, 53100, 70000};
for (int port : contoh) {
System.out.printf("port %-6d -> %s%n", port, kategori(port));
}
}
}Output yang Dihasilkan:
port 80 -> well-known
port 443 -> well-known
port 8080 -> registered
port 0 -> ephemeral (dipilih sistem)
port 53100 -> dynamic/ephemeral
port 70000 -> tidak validMethod kategori() memeriksa batas rentang secara berurutan: angka di luar 0-65535 ditolak, port 0 berarti “serahkan pada sistem”, port di bawah 1024 disebut well-known karena dipesan untuk layanan standar seperti HTTP dan SSH, dan rentang 49152 ke atas adalah wilayah ephemeral. Angka 70000 ditolak karena melewati batas 16-bit milik port.
TCP vs UDP #
Dua protokol transport ini menawarkan pertukaran yang mendasar, dan Java menyediakan class terpisah untuk keduanya.
| Aspek | TCP | UDP |
|---|---|---|
| Pola koneksi | terhubung (connection-oriented) | tanpa koneksi (connectionless) |
| Keandalan | ada ACK, urutan terjaga, retransmisi otomatis | tidak dijamin sampai atau berurutan |
| Kecepatan | lebih banyak overhead | overhead minimum, tundaan rendah |
| Batas data | aliran byte tanpa batas pesan | paket terpisah maksimal sekitar 64 KB |
| Cocok untuk | HTTP, database, transfer berkas | DNS lookup, streaming, game realtime |
| Class Java | Socket, ServerSocket | DatagramSocket, DatagramPacket |
Pilih TCP ketika data harus utuh dan berurutan — hampir semua kasus bisnis. Pilih UDP ketika tundaan lebih penting daripada kelengkapan data, misalnya siaran posisi pemain yang usang boleh dibuang begitu paket berikutnya tiba.
Peta API Networking Java #
Pustaka standar mengelompokkan API jaringan ke dalam beberapa package, dan masing-masing punya bidang tugas yang jelas:
java.net— fondasi:InetAddress,URI,Socket,ServerSocket,DatagramSocket.java.net.http— HTTP modern sejak Java 11 (JEP 321):HttpClient,HttpRequest,HttpResponse.javax.net.ssl— TLS:SSLContext,SSLSocketFactory, keystore dan truststore.jdk.httpserver— server HTTP ringan untuk pengujian (com.sun.net.httpserver).
Dengan peta ini, kita tahu ke mana harus melihat ketika kebutuhan muncul: alamat dan socket ada di java.net, percakapan HTTP di java.net.http, dan pengamanan di javax.net.ssl. Class lawas seperti HttpURLConnection masih ada demi kompatibilitas, tetapi materi pada Section ini berfokus pada API modern. Langkah pertama kita setelah fondasi ini adalah membedah alamat jaringan itu sendiri — class URI dan URL — pada Chapter berikutnya.
Referensi #
- Oracle: java.net Package Summary
- Oracle: InetAddress API
- Oracle: java.net.http Package Summary
- dev.java: Belajar Java
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
KategoriPort.java
Unduh berkaspublic class KategoriPort {
static String kategori(int port) {
if (port < 0 || port > 65535) {
return "tidak valid";
}
if (port == 0) {
return "ephemeral (dipilih sistem)";
}
if (port < 1024) {
return "well-known";
}
if (port < 49152) {
return "registered";
}
return "dynamic/ephemeral";
}
public static void main(String[] args) {
int[] contoh = {80, 443, 8080, 0, 53100, 70000};
for (int port : contoh) {
System.out.printf("port %-6d -> %s%n", port, kategori(port));
}
}
}
PetaAlamat.java
Unduh berkasimport java.net.InetAddress;
public class PetaAlamat {
public static void main(String[] args) throws Exception {
// Alamat loopback tersedia tanpa menyentuh jaringan nyata
InetAddress loopback = InetAddress.getLoopbackAddress();
System.out.println("hostAddress loopback : " + loopback.getHostAddress());
System.out.println("isLoopbackAddress : " + loopback.isLoopbackAddress());
// Nama "localhost" diselesaikan lewat berkas hosts sistem operasi
InetAddress lokal = InetAddress.getByName("localhost");
System.out.println("getHostName : " + lokal.getHostName());
System.out.println("hostAddress localhost : " + lokal.getHostAddress());
}
}