Java NIO - Canal de datagramas

Java NIO Datagram se utiliza como canal que puede enviar y recibir paquetes UDP a través de un protocolo sin conexión. Por defecto, el canal del datagrama está bloqueado mientras que se puede usar en modo no bloqueante. Para que sea no bloqueante podemos usar el configureBlocking ( false) El canal DataGram se puede abrir llamando a uno de los métodos estáticos denominados como open() que también puede tomar la dirección IP como parámetro para que pueda usarse para multidifusión.

El canal de datagrama al igual que FileChannel no está conectado por defecto para que esté conectado, tenemos que llamar explícitamente a su método connect (). Sin embargo, el canal de datagrama no necesita estar conectado para que los métodos de envío y recepción se usen mientras debe estar conectado. para utilizar los métodos de lectura y escritura, ya que esos métodos no aceptan ni devuelven direcciones de socket.

Podemos verificar el estado de la conexión del canal de datagramas llamando a su isConnected() Una vez conectado, un canal de datagramas permanece conectado hasta que se desconecta o cierra. Los canales de datos son seguros para subprocesos y admiten subprocesos múltiples y concurrencia simultáneamente.

Métodos importantes de canal de datagramas

  • bind(SocketAddress local) - Este método se utiliza para vincular el conector del canal del datagrama a la dirección local que se proporciona como parámetro para este método.

  • connect(SocketAddress remote) - Este método se utiliza para conectar el enchufe a la dirección remota.

  • disconnect() - Este método se utiliza para desconectar el enchufe de la dirección remota.

  • getRemoteAddress() - Este método devuelve la dirección de la ubicación remota a la que está conectado el enchufe del canal.

  • isConnected() - Como ya se mencionó, este método devuelve el estado de conexión del canal del datagrama, es decir, si está conectado o no.

  • open() and open(ProtocolFamily family) - El método abierto se utiliza para abrir un canal de datagrama para una sola dirección, mientras que el método abierto parametrizado abre el canal para varias direcciones representadas como una familia de protocolos.

  • read(ByteBuffer dst) - Este método se utiliza para leer datos del búfer dado a través del canal de datagramas.

  • receive(ByteBuffer dst) - Este método se utiliza para recibir datagramas a través de este canal.

  • send(ByteBuffer src, SocketAddress target) - Este método se utiliza para enviar datagramas a través de este canal.

Ejemplo

El siguiente ejemplo muestra cómo enviar datos desde Java NIO DataGramChannel.

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

Salida

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

Salida

La ejecución del cliente imprimirá la siguiente salida en el servidor.

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