Java NIO - Datagram Kanalı
Java NIO Datagram, bağlantısız bir protokol üzerinden UDP paketleri gönderip alabilen bir kanal olarak kullanılır.Varsayılan datagram kanalı bloke olurken bloke olmayan modda kullanılabilir. Engellemesiz hale getirmek için configureBlocking'i kullanabiliriz ( false) method.DataGram kanalı, olarak adlandırılan statik yöntemlerden biri çağrılarak açılabilir. open() IP adresini de parametre olarak alabilir, böylece çoklu yayın için kullanılabilir.
FileChannel'e benzer Datagram kanalı varsayılan olarak bağlanmaz, bağlanması için açıkça connect () yöntemini çağırmamız gerekir, ancak gönderme ve alma yöntemlerinin bağlanması gerekirken kullanılması için datagram kanalının bağlanması gerekmez. okuma ve yazma yöntemlerini kullanmak için, çünkü bu yöntemler soket adreslerini kabul etmez veya döndürmez.
Datagram kanalının bağlantı durumunu, onu arayarak kontrol edebiliriz. isConnected() Bağlandıktan sonra, bir datagram kanalı bağlantısı kesilene veya kapatılana kadar bağlı kalır.Datagram kanalları iş parçacığı güvenlidir ve aynı anda çoklu iş parçacığı ve eşzamanlılığı destekler.
Datagram kanalının önemli yöntemleri
bind(SocketAddress local) - Bu yöntem, datagram kanalının soketini, bu yönteme parametre olarak sağlanan yerel adrese bağlamak için kullanılır.
connect(SocketAddress remote) - Bu yöntem soketi uzak adrese bağlamak için kullanılır.
disconnect() - Bu yöntem soketin uzak adresle olan bağlantısını kesmek için kullanılır.
getRemoteAddress() - Bu yöntem, kanal soketinin bağlı olduğu uzak konumun adresini döndürür.
isConnected() - Daha önce belirtildiği gibi, bu yöntem verikatarının bağlantı durumunu, yani bağlı olup olmadığını döndürür.
open() and open(ProtocolFamily family) - Açık yöntem, tek adres için bir datagram kanalı açıkken, protokol ailesi olarak temsil edilen çoklu adresler için parametrize açık yöntem açık kanal kullanılır.
read(ByteBuffer dst) - Bu yöntem, verikatarı kanalı aracılığıyla verilen arabellekteki verileri okumak için kullanılır.
receive(ByteBuffer dst) - Bu yöntem, bu kanal üzerinden datagram almak için kullanılır.
send(ByteBuffer src, SocketAddress target) - Bu yöntem, bu kanal üzerinden datagram göndermek için kullanılır.
Misal
Aşağıdaki örnek, Java NIO DataGramChannel'dan nasıl veri gönderileceğini gösterir.
Sunucu: 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();
}
}
Çıktı
Server Started: localhost/127.0.0.1:8989
İstemci: 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();
}
}
Çıktı
İstemciyi çalıştırmak aşağıdaki çıktıyı sunucuda yazdıracaktır.
Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857 sent: Hello World!