Java NIO - Canal de datagramme

Java NIO Datagram est utilisé comme canal qui peut envoyer et recevoir des paquets UDP via une connexion sans protocole.Par défaut, le canal de datagramme est bloquant alors qu'il peut être utilisé en mode non bloquant.Afin de le rendre non bloquant, nous pouvons utiliser le configureBlocking ( false) Le canal DataGram peut être ouvert en appelant sa méthode statique nommée comme open() qui peut également prendre l'adresse IP comme paramètre afin qu'elle puisse être utilisée pour la multi-diffusion.

Le canal de datagramme de FileChannel n'est pas connecté par défaut afin de le rendre connecté, nous devons appeler explicitement sa méthode connect () Cependant, le canal de datagramme n'a pas besoin d'être connecté pour que les méthodes d'envoi et de réception soient utilisées alors qu'il doit être connecté afin d'utiliser les méthodes de lecture et d'écriture, car ces méthodes n'acceptent ni ne retournent les adresses de socket.

Nous pouvons vérifier l'état de connexion du canal de datagramme en appelant son isConnected() Une fois connecté, un canal de datagramme reste connecté jusqu'à ce qu'il soit déconnecté ou fermé. Les canaux de diagramme sont thread-safe et prennent en charge simultanément le multi-threading et la concurrence.

Méthodes importantes de canal de datagramme

  • bind(SocketAddress local) - Cette méthode est utilisée pour lier la socket du canal de datagramme à l'adresse locale qui est fournie comme paramètre de cette méthode.

  • connect(SocketAddress remote) - Cette méthode est utilisée pour connecter la prise à l'adresse distante.

  • disconnect() - Cette méthode est utilisée pour déconnecter le socket de l'adresse distante.

  • getRemoteAddress() - Cette méthode renvoie l'adresse de l'emplacement distant auquel la prise du canal est connectée.

  • isConnected() - Comme déjà mentionné cette méthode retourne l'état de connexion du canal de datagramme c'est-à-dire s'il est connecté ou non.

  • open() and open(ProtocolFamily family) - La méthode ouverte est utilisée pour ouvrir un canal de datagramme pour une seule adresse tandis que la méthode ouverte paramétrée ouvre un canal pour plusieurs adresses représentées comme une famille de protocoles.

  • read(ByteBuffer dst) - Cette méthode est utilisée pour lire les données du tampon donné via le canal de datagramme.

  • receive(ByteBuffer dst) - Cette méthode est utilisée pour recevoir des datagrammes via ce canal.

  • send(ByteBuffer src, SocketAddress target) - Cette méthode est utilisée pour envoyer des datagrammes via ce canal.

Exemple

L'exemple suivant montre comment envoyer des données à partir de Java NIO DataGramChannel.

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

Production

Server Started: localhost/127.0.0.1:8989

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

Production

L'exécution du client imprimera la sortie suivante sur le serveur.

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