Panduan Untuk UDP Di Jawa

1. Ikhtisar

Pada artikel ini, kita akan menjelajahi komunikasi jaringan dengan Java, melalui User Datagram Protocol (UDP).

UDP adalah protokol komunikasi yang mentransmisikan paket independen melalui jaringan tanpa jaminan kedatangan dan tidak ada jaminan urutan pengiriman .

Sebagian besar komunikasi melalui internet dilakukan melalui Transmission Control Protocol (TCP), namun UDP memiliki tempatnya yang akan kita bahas di bagian selanjutnya.

2. Mengapa Menggunakan UDP?

UDP sangat berbeda dari TCP yang lebih umum. Tetapi sebelum mempertimbangkan kelemahan level permukaan UDP, penting untuk dipahami bahwa kurangnya overhead dapat membuatnya jauh lebih cepat daripada TCP.

Selain kecepatan, kita juga perlu mengingat bahwa beberapa jenis komunikasi tidak memerlukan keandalan TCP tetapi lebih mengutamakan latensi rendah. Video adalah contoh bagus dari aplikasi yang mungkin mendapat manfaat dari menjalankan UDP, bukan TCP.

3. Membangun Aplikasi UDP

Membangun aplikasi UDP sangat mirip dengan membangun sistem TCP; satu-satunya perbedaan adalah kita tidak membuat koneksi titik ke titik antara klien dan server.

Penyiapannya juga sangat mudah. Java dilengkapi dengan dukungan jaringan built-in untuk UDP - yang merupakan bagian dari paket java.net . Oleh karena itu untuk melakukan operasi jaringan lebih UDP, kita hanya perlu mengimpor kelas dari java.net paket: java.net.DatagramSocket dan java.net.DatagramPacket .

Pada bagian berikut, kita akan belajar bagaimana merancang aplikasi yang berkomunikasi melalui UDP; kami akan menggunakan protokol gema populer untuk aplikasi ini.

Pertama, kami akan membangun server gema yang mengirim kembali pesan apa pun yang dikirim ke sana, lalu klien gema yang hanya mengirim pesan sewenang-wenang ke server dan terakhir, kami akan menguji aplikasi untuk memastikan semuanya berfungsi dengan baik.

4. Server

Dalam komunikasi UDP, satu pesan dienkapsulasi dalam DatagramPacket yang dikirim melalui DatagramSocket .

Mari kita mulai dengan menyiapkan server sederhana:

public class EchoServer extends Thread { private DatagramSocket socket; private boolean running; private byte[] buf = new byte[256]; public EchoServer() { socket = new DatagramSocket(4445); } public void run() { running = true; while (running) { DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); InetAddress address = packet.getAddress(); int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); String received = new String(packet.getData(), 0, packet.getLength()); if (received.equals("end")) { running = false; continue; } socket.send(packet); } socket.close(); } }

Kami membuat DatagramSocket global yang akan kami gunakan untuk mengirim paket, array byte untuk membungkus pesan kami, dan variabel status yang disebut berjalan .

Untuk kesederhanaan, server memperluas Thread , jadi kita bisa mengimplementasikan semua yang ada di dalam metode run .

Di dalam run , kami membuat while loop yang hanya berjalan sampai running diubah menjadi false oleh beberapa error atau pesan terminasi dari klien.

Di bagian atas loop, kami membuat instance DatagramPacket untuk menerima pesan masuk.

Selanjutnya, kami memanggil metode terima pada soket. Metode ini memblokir hingga pesan tiba dan menyimpan pesan di dalam array byte dari DatagramPacket yang diteruskan kepadanya.

Setelah menerima pesan, kami mengambil alamat dan port klien, karena kami akan mengirimkan tanggapan

kembali.

Selanjutnya, kami membuat DatagramPacket untuk mengirim pesan ke klien. Perhatikan perbedaan tanda tangan dengan paket penerima. Yang ini juga membutuhkan alamat dan port klien yang kami kirimi pesan.

5. Klien

Sekarang mari kita luncurkan klien sederhana untuk server baru ini:

public class EchoClient { private DatagramSocket socket; private InetAddress address; private byte[] buf; public EchoClient() { socket = new DatagramSocket(); address = InetAddress.getByName("localhost"); } public String sendEcho(String msg) { buf = msg.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445); socket.send(packet); packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String( packet.getData(), 0, packet.getLength()); return received; } public void close() { socket.close(); } }

Kode tersebut tidak jauh berbeda dari server. Kami memiliki DatagramSocket global dan alamat server. Kami memberi contoh ini di dalam konstruktor.

Kami memiliki metode terpisah yang mengirim pesan ke server dan mengembalikan respons.

Pertama-tama kita mengubah pesan string menjadi array byte, kemudian membuat DatagramPacket untuk mengirim pesan.

Selanjutnya - kami mengirim pesan. Kami segera mengubah DatagramPacket menjadi penerima.

Ketika gema tiba, kami mengubah byte menjadi string dan mengembalikan string tersebut.

6. Tes

Di kelas UDPTest.java , kita cukup membuat satu pengujian untuk memeriksa kemampuan echo dari dua aplikasi kita:

public class UDPTest { EchoClient client; @Before public void setup(){ new EchoServer().start(); client = new EchoClient(); } @Test public void whenCanSendAndReceivePacket_thenCorrect() { String echo = client.sendEcho("hello server"); assertEquals("hello server", echo); echo = client.sendEcho("server is working"); assertFalse(echo.equals("hello server")); } @After public void tearDown() { client.sendEcho("end"); client.close(); } }

Dalam pengaturan , kami memulai server dan juga membuat klien. Sedangkan pada metode tearDown , kami mengirimkan pesan terminasi ke server agar bisa menutup dan sekaligus menutup klien.

7. Kesimpulan

Pada artikel ini, kita telah mempelajari tentang User Datagram Protocol dan berhasil membangun aplikasi server-klien kita sendiri yang berkomunikasi melalui UDP.

Untuk mendapatkan kode sumber lengkap untuk contoh yang digunakan dalam artikel ini, Anda dapat melihat proyek GitHub.