Учебники

Java NIO — канал дейтаграмм

Java NIO дейтаграмма используется в качестве канала, который может отправлять и получать UDP-пакеты по протоколу без установления соединения. По умолчанию канал дейтаграмм блокируется, и его можно использовать в неблокирующем режиме. Чтобы сделать его неблокирующим, мы можем использовать configureBlocking ( false) метод. Канал DataGram можно открыть, вызвав его один из статических методов с именем open (), который также может принимать IP-адрес в качестве параметра, чтобы его можно было использовать для многоадресной передачи.

Канал дейтаграммы в FileChannel по умолчанию не подключен, чтобы его подключить, мы должны явно вызвать его метод connect (). Однако канал дейтаграммы не нужно подключать, чтобы использовать методы отправки и получения, пока он должен быть подключен. чтобы использовать методы чтения и записи, поскольку эти методы не принимают или не возвращают адреса сокетов.

Мы можем проверить состояние соединения канала дейтаграмм, вызвав его метод isConnected (). После подключения канал дейтаграмм остается подключенным до тех пор, пока он не будет отключен или закрыт. Каналы дейтаграмм являются поточно-ориентированными и поддерживают многопоточность и параллелизм одновременно.

Важные методы дейтаграммы канала

  • bind (SocketAddress local) — этот метод используется для привязки сокета канала дейтаграммы к локальному адресу, который предоставляется в качестве параметра для этого метода.

  • connect (SocketAddress remote) — этот метод используется для подключения сокета к удаленному адресу.

  • disconnect () — этот метод используется для отключения сокета от удаленного адреса.

  • getRemoteAddress () — Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.

  • isConnected () — как уже упоминалось, этот метод возвращает статус подключения канала дейтаграммы, т. е. подключен он или нет.

  • open () и open (семейство ProtocolFamily) — используется метод Open, который открывает канал дейтаграммы для одного адреса, в то время как параметризованный метод Open метод открытия канала для нескольких адресов, представленных в виде семейства протоколов.

  • read (ByteBuffer dst) — этот метод используется для чтения данных из данного буфера через канал дейтаграммы.

  • receive (ByteBuffer dst) — этот метод используется для получения дейтаграммы через этот канал.

  • send (ByteBuffer src, SocketAddress target) — этот метод используется для отправки дейтаграммы по этому каналу.

bind (SocketAddress local) — этот метод используется для привязки сокета канала дейтаграммы к локальному адресу, который предоставляется в качестве параметра для этого метода.

connect (SocketAddress remote) — этот метод используется для подключения сокета к удаленному адресу.

disconnect () — этот метод используется для отключения сокета от удаленного адреса.

getRemoteAddress () — Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.

isConnected () — как уже упоминалось, этот метод возвращает статус подключения канала дейтаграммы, т. е. подключен он или нет.

open () и open (семейство ProtocolFamily) — используется метод Open, который открывает канал дейтаграммы для одного адреса, в то время как параметризованный метод Open метод открытия канала для нескольких адресов, представленных в виде семейства протоколов.

read (ByteBuffer dst) — этот метод используется для чтения данных из данного буфера через канал дейтаграммы.

receive (ByteBuffer dst) — этот метод используется для получения дейтаграммы через этот канал.

send (ByteBuffer src, SocketAddress target) — этот метод используется для отправки дейтаграммы по этому каналу.

пример

В следующем примере показано, как отправить данные из Java NIO DataGramChannel.

Сервер: 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();
   }
}

Выход

Server Started: localhost/127.0.0.1:8989

Клиент: 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();
   }
}

Выход

Запущенный клиент распечатает следующий вывод на сервере.