9 Nisan 2018 Pazartesi

MulticastSocket Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.net.MulticastSocket;
DatagramSocket sınıfından kalıtır.

Multicast paketleri okumak için NIO kullanmıyorsak mutlaka bu sınıfı kullanmak gerekir. Ancak multicast paket göndermek için bu sınıf veya DatagramSocket kullanılabilir.

Multicast IP Adresi
Bu adres aralığı [224.0.0.0 - 239.255.255.255] arasında. IPV4 Adres Çeşitleri yazısına bakabilirsiniz. 

Kaç Tane Multicast Grup Açılabilir
Bu tamamen subnet'i yöneten Router ayarlarına bağlı. Çoğunlukla bir üst sınır olmuyor. Ancak bazen üst sınır konulabiliyor. Router'ı yöneten kişiye danışmak lazım.

Kullanım
Örnek 
Multicast paketleri almak için şöyle yaparız. Port numarası constructor'da belirtiliyor. joinGroup() ile IP adresi belirtiliyor. Böylece 230.0.0.0:4446 adresine gönderilen multicast paketleri alabiliriz.
public void run() {
  MulticastSocket socket = new MulticastSocket(4446);
  InetAddress group = InetAddress.getByName("230.0.0.0");
  socket.joinGroup(group);

  byte[] buf = new byte[256];
  DatagramPacket packet = new DatagramPacket(buf, buf.length);
  while (true) {
    socket.receive(packet);
    String received = new String(packet.getData(), 0, packet.getLength());
    if ("end".equals(received)) {
      break;
    }
  }
  socket.leaveGroup(group);
  socket.close();
}
Örnek
Multicast paket göndermek için şöyle yaparız. Paketler 230.0.0.0:4446 adresine gönderiliyor.
public void multicast(String multicastMessage) throws IOException {
  DatagramSocket socket = new DatagramSocket();
  InetAddress group = InetAddress.getByName("230.0.0.0");
  byte[] buf = multicastMessage.getBytes();

  DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446);
  socket.send(packet);
  socket.close();
}
Örnek
Multicast paket göndermek için şöyle yaparız. Paketler 226.4.5.6:5000 adresine gönderiliyor.
String group = "226.4.5.6"; MulticastSocket ms = new MulticastSocket(); String message = "Hello"; DatagramPacket dp = new DatagramPacket( message.getBytes(), message.length(), InetAddress.getByName(group), 5000 ); ms.send(dp); ms.close();

constructor - default
Multicast paket göndermek için kullanılır. Bu durumda DatagramPacket içinde multicast adresi ve portu belirtmek gerekir. Şöyle yaparız.
MulticastSocket socket = new MulticastSocket();
constructor - port
Multicast paket okumak için kullanılır. Bu çağrıdan sonra okumak için joinGroup() ile kullanılacak adresi belirtmek gerekir. Şöyle yaparız. Bu constructor ile belirtilen port numarasına unicast UDP gönderilse de okunur.
MulticastSocket socket = new MulticastSocket(4446);
constructor - SocketAddress
Multicast paket okumak için kullanılır. SocketAddress parametresi multicast adres olmalı. Ağ kartının IP adresi olursa joinGroup() ile gruba katılınsa dahi destination IP adresi tutmadığı için paket okunamaz.  Bu constructor ile belirtilen port numarasına unicast UDP gönderilse de okunmaz.
Örnek
Şöyle yaparız
MulticastSocket socket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));
Örnek
Şöyle yaparız.
InetAddress group = InetAddress.getByName(MULTICAST_IP);
SocketAddress sockaddr = new InetSocketAddress(group,PORT);
socket = new MulticastSocket(sockaddr);
joinGroup metodu
Açıklaması şöyle.
To receive a multicast datagram, a process must join the multicast group and it must also bind a UDP socket to the prot number that will be used as destination port number for datagrams sent to the group. The two operations are distinct and both are required. Joining the group tells the host's IP layer and datalink layer to receive multicast datagrams sent to that group. Binding the port is how the application specifies to UDP that it wants to receive datagrams sent to that port. Some applications also bind the multicast address to the socket, in addition to the port. this prevents any other datagrams that might be received for that port to other unicast, broadcast or multicast addresses from being delivered to the socket.
Paketleri okumak için kullanılır.
Örnek
Şöyle yaparız.
socket.joinGroup(InetAddress.getByName(MCAST_ADDR));
Örnek
Şöyle yaparız.
InetAddress group = InetAddress.getByName("228.5.6.7");
socket.joinGroup(group);
leaveGroup metodu
Paketleri artık okumamak için kullanılır.
Örnek ver

receive metodu
Şöyle yaparız.
byte[] b = new byte[BUFFER_LENGTH];
DatagramPacket dgram = new DatagramPacket(b, b.length);
socket.receive(dgram); // blocks until a datagram is received
send metodu
Şöyle yaparız.
DatagramPacket msg= ...;
socket.send(msg);
setLoopbackMode metodu
Şöyle yaparız.
socket.setLoopbackMode(true);
setReuseAddress metodu
Açıklaması şöyle.
Enable/disable the SO_REUSEADDR socket option. For UDP sockets it may be necessary to bind more than one socket to the same socket address. This is typically for the purpose of receiving multicast packets (See MulticastSocket). The SO_REUSEADDR socket option allows multiple sockets to be bound to the same socket address if the SO_REUSEADDR socket option is enabled prior to binding the socket using bind(SocketAddress).
Note: This functionality is not supported by all existing platforms, so it is implementation specific whether this option will be ignored or not. However, if it is not supported then getReuseAddress() will always return false.
Şöyle yaparız.
socket.setReuseAddress(true);
Şu kod doğru değil
int port = ...;
multicastSocket.bind(new InetSocketAddress(port));
multicastSocket.setReuseAddress(true);


Hiç yorum yok:

Yorum Gönder