Java NIO - Datagram Channel

Java NIO Datagram viene utilizzato come canale che può inviare e ricevere pacchetti UDP su un protocollo senza connessione.Per impostazione predefinita il canale del datagramma è bloccante mentre può essere utilizzato in modalità non bloccante.Per renderlo non bloccante possiamo usare il configureBlocking ( false) Il canale DataGram può essere aperto chiamando il suo metodo statico denominato come open() che può anche prendere l'indirizzo IP come parametro in modo che possa essere utilizzato per il multi casting.

Il canale del datagramma come FileChannel non è connesso di default per renderlo connesso dobbiamo chiamare esplicitamente il suo metodo connect () Tuttavia il canale del datagramma non ha bisogno di essere connesso per poter usare i metodi di invio e ricezione mentre deve essere connesso per utilizzare i metodi di lettura e scrittura, poiché questi metodi non accettano né restituiscono indirizzi socket.

Possiamo controllare lo stato della connessione del canale del datagramma chiamando il suo isConnected() Una volta connesso, un canale del datagramma rimane connesso fino a quando non viene disconnesso o chiuso. I canali del datagramma sono thread-safe e supportano simultaneamente il multi-threading e la concorrenza.

Metodi importanti per il canale del datagramma

  • bind(SocketAddress local) - Questo metodo viene utilizzato per associare il socket del canale del datagramma all'indirizzo locale fornito come parametro a questo metodo.

  • connect(SocketAddress remote) - Questo metodo viene utilizzato per connettere la presa all'indirizzo remoto.

  • disconnect() - Questo metodo viene utilizzato per scollegare il socket all'indirizzo remoto.

  • getRemoteAddress() - Questo metodo restituisce l'indirizzo della posizione remota a cui è connesso il socket del canale.

  • isConnected() - Come già accennato questo metodo restituisce lo stato di connessione del canale del datagramma cioè se è connesso o meno.

  • open() and open(ProtocolFamily family) - Il metodo aperto viene utilizzato per aprire un canale datagramma per un singolo indirizzo, mentre il metodo aperto parametrizzato apre il canale per più indirizzi rappresentati come famiglia di protocollo.

  • read(ByteBuffer dst) - Questo metodo viene utilizzato per leggere i dati dal buffer specificato attraverso il canale del datagramma.

  • receive(ByteBuffer dst) - Questo metodo viene utilizzato per ricevere il datagramma tramite questo canale.

  • send(ByteBuffer src, SocketAddress target) - Questo metodo viene utilizzato per inviare il datagramma tramite questo canale.

Esempio

Il seguente esempio mostra come inviare dati da 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();
   }
}

Produzione

Server Started: localhost/127.0.0.1:8989

Cliente: 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();
   }
}

Produzione

L'esecuzione del client stamperà il seguente output sul server.

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