이번에는 DatagramSocket과 MulticastSocket으로 멀티캐스트를 구현해보려고 한다.
출처 : http://ko.wikipedia.org/wiki/멀티캐스트
멀티 캐스트는 여러개의 노드에게 패킷을 보내는 방법이다.
브로드 캐스트와 비슷하지만, 특정한 노드에게 패킷을 보낸다는 것이 차이점.
멀티 캐스트의 수신자들은 어떤 하나의 가상 ip 주소로 패킷을 받는다.
이때 사용하는 가상의 ip주소는 class D (224.0.0.0 - 239.255.255.255)를 쓴다.
ip주소의 클래스는 아래를 참고
https://ko.wikipedia.org/wiki/네트워크_클래스
송신자는 그 가상의 ip주소로 패킷을 보내면 되는 것이다.
이번에도 가상머신을 사용한다.
가상머신을 사용하기전에 해야 할것이 있다.
224.0.0.1
을 멀티캐스트 ip주소로 사용할 것 인데,
기본으로 방화벽이 설정되어 있다.
그래서 다음 명령어로 방화벽을 내리고 시작한다.
systemctl stop firewalld
그리고 멀티캐스트 주소를 위한 라우팅 경로도 새로 만들어 줘야한다.
route add -net 224.0.0.0 netmask 240.0.0.0 [network interface]
public class ServerSocket {
public static String getMyIp() throws SocketException {
Enumeration<InetAddress> enumIpAddr = NetworkInterface.getByName("enp0s8").getInetAddresses();
while (enumIpAddr.hasMoreElements()) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress())
{
return inetAddress.getHostAddress();
}
}
return null;
}
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "My ip is : " + getMyIp();
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("224.0.0.1"), 6000);
socket.send(packet);
socket.close();
}
}
서버에서 보낼땐 이전 포스팅에서 사용했던 DatagramSocket
을 그대로 사용한다.
이전과 다른 점은 패킷의 주소가 InetAddress.getByName("224.0.0.1")
으로 224.0.0.1
로 패킷을 보낸다.
서버코드에서 이전과 다른 getMyIp()
를 사용했다.
서버의 여러개의 네트워크 인터페이스 중 내부 망 네트워크를 선택하고, 그중 진짜 ip주소를 선별하기 위한것이다.
(유니캐스트는 TCP에서 연결을 해주기 때문에 이럴 필요가 없지만, 이번에는 UDP통신을 하기때문임)
public class ClientSocket {
public static void main(String[] args) throws IOException {
MulticastSocket socket = new MulticastSocket(6000);
socket.joinGroup(InetAddress.getByName("224.0.0.1"));
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String str = new String(buf, 0, packet.getLength());
System.out.println("input : " + str);
socket.close();
}
}
클라이언트는 MulticastSocket
을 사용한다.
MulticastSocket
는 joinGroup()
이라는 함수로 패킷을 어떤 ip주소로 받아 올 것인지를 정할 수 있다. 이것을 그룹에 가입한다고 한다.
서버는 1개, 클라이언트는 2개를 띄워서 실행했다.
클라이언트 각각의 결과는 아래와 같다.
들 다 패킷을 잘 받은 것을 확인 할 수 있다.