Java NIO - Datagrammkanal

Java NIO Datagram wird als Kanal verwendet, der UDP-Pakete über ein Protokoll ohne Verbindung senden und empfangen kann. Der Standard-Datagrammkanal blockiert, während er im nicht blockierenden Modus verwendet werden kann. Um ihn nicht zu blockieren, können wir configureBlocking ( false) method.DataGram-Kanal kann geöffnet werden, indem eine der statischen Methoden mit dem Namen as aufgerufen wird open() Die IP-Adresse kann auch als Parameter verwendet werden, damit sie für Multi-Casting verwendet werden kann.

Der Datagrammkanal von FileChannel ist standardmäßig nicht verbunden, um eine Verbindung herzustellen. Wir müssen seine connect () -Methode explizit aufrufen. Der Datagrammkanal muss jedoch nicht verbunden sein, damit die Sende- und Empfangsmethoden verwendet werden können, während er verbunden sein muss um die Lese- und Schreibmethoden zu verwenden, da diese Methoden keine Socket-Adressen akzeptieren oder zurückgeben.

Wir können den Verbindungsstatus des Datagrammkanals überprüfen, indem wir dessen aufrufen isConnected() Sobald eine Verbindung hergestellt ist, bleibt ein Datagrammkanal verbunden, bis er getrennt oder geschlossen wird. Datagrammkanäle sind threadsicher und unterstützen gleichzeitig Multithreading und Parallelität.

Wichtige Methoden des Datagrammkanals

  • bind(SocketAddress local) - Diese Methode wird verwendet, um den Socket des Datagrammkanals an die lokale Adresse zu binden, die als Parameter für diese Methode angegeben wird.

  • connect(SocketAddress remote) - Mit dieser Methode wird der Socket mit der Remote-Adresse verbunden.

  • disconnect() - Mit dieser Methode wird der Socket von der Remote-Adresse getrennt.

  • getRemoteAddress() - Diese Methode gibt die Adresse des Remote-Standorts zurück, an den der Socket des Kanals angeschlossen ist.

  • isConnected() - Wie bereits erwähnt, gibt diese Methode den Verbindungsstatus des Datagrammkanals zurück, dh ob er verbunden ist oder nicht.

  • open() and open(ProtocolFamily family) - Die offene Methode wird verwendet, um einen Datagrammkanal für eine einzelne Adresse zu öffnen, während die offene Methode der parametrisierten offenen Methode für mehrere Adressen verwendet wird, die als Protokollfamilie dargestellt werden.

  • read(ByteBuffer dst) - Diese Methode wird verwendet, um Daten aus dem angegebenen Puffer über den Datagrammkanal zu lesen.

  • receive(ByteBuffer dst) - Mit dieser Methode wird ein Datagramm über diesen Kanal empfangen.

  • send(ByteBuffer src, SocketAddress target) - Mit dieser Methode wird ein Datagramm über diesen Kanal gesendet.

Beispiel

Das folgende Beispiel zeigt, wie Daten von Java NIO DataGramChannel gesendet werden.

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

Ausgabe

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

Ausgabe

Wenn Sie den Client ausführen, wird die folgende Ausgabe auf dem Server gedruckt.

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