Java NIO - Saluran Datagram

Java NIO Datagram digunakan sebagai channel yang dapat mengirim dan menerima paket UDP melalui koneksi tanpa protokol. Secara default datagram channel adalah blocking sementara itu dapat digunakan dalam mode non-blocking. Untuk membuatnya non-blocking kita dapat menggunakan configureBlocking ( false). Saluran DataGram dapat dibuka dengan memanggil salah satu metode statisnya yang bernama open() yang juga dapat mengambil alamat IP sebagai parameter sehingga dapat digunakan untuk multi casting.

Saluran datagram seperti FileChannel tidak terhubung secara default untuk membuatnya terhubung kita harus secara eksplisit memanggil metode connect (). Namun saluran datagram tidak perlu terhubung agar metode kirim dan terima dapat digunakan saat harus terhubung untuk menggunakan metode baca dan tulis, karena metode tersebut tidak menerima atau mengembalikan alamat soket.

Kita dapat memeriksa status koneksi saluran datagram dengan memanggil its isConnected() metode. Setelah terhubung, saluran datagram tetap terhubung sampai terputus atau ditutup. saluran datagram aman untuk benang dan mendukung multi-threading dan konkurensi secara bersamaan.

Metode penting saluran datagram

  • bind(SocketAddress local) - Metode ini digunakan untuk mengikat soket saluran datagram ke alamat lokal yang disediakan sebagai parameter untuk metode ini.

  • connect(SocketAddress remote) - Metode ini digunakan untuk menghubungkan soket ke alamat jarak jauh.

  • disconnect() - Metode ini digunakan untuk memutuskan soket ke alamat jarak jauh.

  • getRemoteAddress() - Metode ini mengembalikan alamat lokasi jarak jauh di mana soket saluran terhubung.

  • isConnected() - Seperti yang telah disebutkan, metode ini mengembalikan status koneksi saluran datagram, yaitu apakah itu terhubung atau tidak.

  • open() and open(ProtocolFamily family) - Metode terbuka digunakan membuka saluran datagram untuk alamat tunggal sedangkan metode terbuka parametrized saluran terbuka untuk beberapa alamat direpresentasikan sebagai keluarga protokol.

  • read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran datagram.

  • receive(ByteBuffer dst) - Metode ini digunakan untuk menerima datagram melalui saluran ini.

  • send(ByteBuffer src, SocketAddress target) - Metode ini digunakan untuk mengirim datagram melalui saluran ini.

Contoh

Contoh berikut menunjukkan cara mengirim data dari Java NIO DataGramChannel.

Server: DatagramChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelServer {
   public static void main(String[] args) throws IOException {
      DatagramChannel server = DatagramChannel.open();
      InetSocketAddress iAdd = new InetSocketAddress("localhost", 8989);
      server.bind(iAdd);
      System.out.println("Server Started: " + iAdd);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      //receive buffer from client.
      SocketAddress remoteAdd = server.receive(buffer);
      //change mode of buffer
      buffer.flip();
      int limits = buffer.limit();
      byte bytes[] = new byte[limits];
      buffer.get(bytes, 0, limits);
      String msg = new String(bytes);
      System.out.println("Client at " + remoteAdd + "  sent: " + msg);
      server.send(buffer,remoteAdd);
      server.close();
   }
}

Keluaran

Server Started: localhost/127.0.0.1:8989

Klien: DatagramChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;

public class DatagramChannelClient {
   public static void main(String[] args) throws IOException {
      DatagramChannel client = null;
      client = DatagramChannel.open();

      client.bind(null);

      String msg = "Hello World!";
      ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
      InetSocketAddress serverAddress = new InetSocketAddress("localhost",
        8989);

      client.send(buffer, serverAddress);
      buffer.clear();
      client.receive(buffer);
      buffer.flip();
    
      client.close();
   }
}

Keluaran

Menjalankan klien akan mencetak keluaran berikut di server.

Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857  sent: Hello World!