Java NIO - канал дейтаграмм
Датаграмма Java NIO используется в качестве канала, который может отправлять и получать UDP-пакеты по протоколу без подключения. По умолчанию канал датаграммы блокируется, хотя его можно использовать в неблокирующем режиме. Чтобы сделать его неблокирующим, мы можем использовать configureBlocking ( false) .Канал DataGram можно открыть, вызвав его один из статических методов с именем open() который также может принимать IP-адрес в качестве параметра, чтобы его можно было использовать для многоадресной передачи.
Канал дейтаграммы, как и FileChannel, по умолчанию не подключается, чтобы его можно было подключить, мы должны явно вызвать его метод connect (). Однако канал дейтаграммы не нужно подключать, чтобы можно было использовать методы отправки и получения, пока он должен быть подключен чтобы использовать методы чтения и записи, поскольку эти методы не принимают и не возвращают адреса сокетов.
Мы можем проверить состояние подключения канала дейтаграммы, вызвав его isConnected() После подключения канал дейтаграммы остается подключенным до тех пор, пока он не будет отключен или закрыт. Каналы дейтаграммы являются потокобезопасными и поддерживают одновременную многопоточность и параллелизм.
Важные методы канала дейтаграммы
bind(SocketAddress local) - Этот метод используется для привязки сокета канала дейтаграммы к локальному адресу, который предоставляется в качестве параметра для этого метода.
connect(SocketAddress remote) - Этот метод используется для подключения сокета к удаленному адресу.
disconnect() - Этот метод используется для отключения сокета от удаленного адреса.
getRemoteAddress() - Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.
isConnected() - Как уже упоминалось, этот метод возвращает статус подключения канала дейтаграммы, то есть подключен он или нет.
open() and open(ProtocolFamily family) - Открытый метод используется для открытия канала дейтаграммы для одного адреса, в то время как параметризованный открытый метод открывает канал для нескольких адресов, представленных как семейство протоколов.
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();
}
}
Вывод
Запуск клиента распечатает следующий вывод на сервере.
Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857 sent: Hello World!