Java NIO - Canal de Datagramas
O Java NIO Datagram é usado como um canal que pode enviar e receber pacotes UDP através de uma conexão sem protocolo. Por padrão, o canal de datagrama está bloqueando enquanto pode ser usado no modo sem bloqueio. Para torná-lo não bloqueador, podemos usar o configureBlocking ( false) method.DataGram canal pode ser aberto chamando seu um dos métodos estáticos nomeados como open() que também pode ter o endereço IP como parâmetro para que possa ser usado para multicast.
O canal de datagrama semelhante ao FileChannel não é conectado por padrão a fim de torná-lo conectado, temos que chamar explicitamente seu método connect (). No entanto, o canal de datagrama não precisa ser conectado para que os métodos de envio e recebimento sejam usados enquanto ele deve ser conectado para usar os métodos de leitura e escrita, uma vez que esses métodos não aceitam ou retornam endereços de soquete.
Podemos verificar o status da conexão do canal de datagrama chamando seu isConnected() Método Uma vez conectado, um canal de datagrama permanece conectado até que seja desconectado ou fechado. Os canais de datagrama são thread-safe e suportam multi-threading e simultaneidade simultaneamente.
Métodos importantes de canal de datagrama
bind(SocketAddress local) - Este método é usado para vincular o soquete do canal de datagrama ao endereço local que é fornecido como parâmetro para este método.
connect(SocketAddress remote) - Este método é usado para conectar o soquete ao endereço remoto.
disconnect() - Este método é usado para desconectar o soquete do endereço remoto.
getRemoteAddress() - Este método retorna o endereço do local remoto ao qual o soquete do canal está conectado.
isConnected() - Como já mencionado, este método retorna o status da conexão do canal de datagrama, ou seja, se está conectado ou não.
open() and open(ProtocolFamily family) - O método aberto é usado para abrir um canal de datagrama para um único endereço, enquanto o método aberto parametrizado abre o canal para vários endereços representados como família de protocolo.
read(ByteBuffer dst) - Este método é usado para ler dados do buffer fornecido por meio do canal de datagrama.
receive(ByteBuffer dst) - Este método é usado para receber datagramas através deste canal.
send(ByteBuffer src, SocketAddress target) - Este método é usado para enviar datagramas por meio deste canal.
Exemplo
O exemplo a seguir mostra como enviar dados do 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();
}
}
Resultado
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();
}
}
Resultado
Executar o cliente imprimirá a seguinte saída no servidor.
Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857 sent: Hello World!