개인참고자료/자바(네트워크)

멀티캐스트 - 간단한 인터넷 방송 클라이언트와 서버 구현

경진 2008. 7. 20. 00:51
간단한 인터넷 방송 클라이언트와 서버 구현

멀티캐스팅을 이용한다는 것은 특정한 IP의 컴퓨터에게 정보를 전송한다는 것이 아니라 불특정 다수에게 정보를 전달한다는 것을 의미한다. 즉, 멀티캐스팅 서버는 패킷에 방송할 내용을 담아서 특정 IP가 아닌 불특정 다수에게 패킷을 전송하면 된다. 나머지 일은 라우터가 알아서 패킷을 전달하면 되는 것이다. 마치 공중파 방송이 불특정 다수에게 방송을 보내기 위해서 전파를 송신하는 것처럼 말이다.

따라서 클라이언트는 네트워크 내에 전달되는 패킷을 읽어들이는 역할만 수행하면 된다. 멀티캐스팅을 위한 서버는 기존의 UDP 방식의 서버 프로그래밍과 거의 같으며 클라이언트의 IP를 DatagramPacket에 지정하는 것이 아니라 멀티캐스트 그룹에 해당하는 Ip를 지정하는 부분만 다르다.

멀티캐스팅을 위한 클라이언트 역시 기존의 UDP 방식의 클라이언트 프로그래밍과 거의 같다. 다른점이 있다면, DatagramSocket이 아니라 MulticastSocket을 사용한다는 것과 멀티캐스트 그룹에 참여 하기 위한 코드가 추가되는 부분이다

방송 서버 구현 : MulticastServer

멀티캐스팅을 위한 서버는 UDP 방식의 서버 프로그래밍과 작성하는 방법이 거의 같으면 멀티캐스팅 그룹에 해당하는 IP를 지정하는 부분이 다르다.

간단한 스레드로 작성했다 실제 중요한 코드는 스레드에 있는 run() 메소드에서 구현한다.

import java.io.*;    
import java.net.*;    
   
public class MulticastServer extends Thread {    
  DatagramSocket socket = null;    
  DatagramPacket packet = null;   
  InetAddress channel =null;   
  int port = 20001;    
  String address = "239.0.0.1";   
  boolean onAir = true;    
   
  public MulticastServer() throws IOException {    
    super("멀티캐스트 방송국");    
    socket = new DatagramSocket(port);    
  }    
   
  public void run() {    
      String msg = "멀티캐스트 방송이 잘 들리시나요?";
    byte[] b = new byte[100];    
    while (onAir) {    
      try {    
        b = msg.getBytes(); // 바이트 배열로 만듦   
        channel = InetAddress.getByName(address);    
        packet = new DatagramPacket(b, b.length, channel, port);    
        socket.send(packet);   
        try {    
          sleep(500);   
          System.out.println("방송중입니다.");   
        } catch (InterruptedException e) { }    
      } catch (IOException e) {    
          e.printStackTrace();    
      }     
    }    
    socket.close();    
  }    
   
  public static void main(String[] args) throws java.io.IOException {    
    new MulticastServer().start();    
  }    
}   

내부 지정용으로 사용되는 "239."로 시작하는 멀티캐스팅 그룹 IP를 DatagramPacket에 지정했다. 그리고 나서 DatagramSocket에 있는 send() 메소드를 이용해서 패킷을 전송했다. 그러면 전송된 패킷은 멀티캐스팅 그룹에 참여한 모든 클라이언트가 읽어들일 수 있게 된다.

      String msg = "멀티캐스트 방송이 잘 들리시나요?";
……
        channel = InetAddress.getByName(address);    
        packet = new DatagramPacket(b, b.length, channel, port);    
        socket.send(packet);   
……

방송 클라이언트 구현 : MulticastClient

멀티캐스팅을 이용하는 채팅 클라이언트는 UDP 방식의 클라이언트를 만드는 방법과 거의 흡사하다.
다른 점이 있다면, DatagramSocket이 아니라 MulicastSocket을 사용하고, 멀티캐스팅 그룹에 참여하는 코드가 추가된 부분이다.

import java.io.*;
import java.net.*; public class MulticastClient {
  MulticastSocket receiver = null;
  DatagramPacket packet = null;
  InetAddress channel =null;
  int port = 20001;
  String address = "239.0.0.1";
  byte[] b = new byte[100];   public MulticastClient () {
     try {
        receiver = new MulticastSocket(port);
        channel = InetAddress.getByName(address);
        packet = new DatagramPacket(b, b.length);
        receiver.joinGroup(channel);
        for (int i=0; i<3; i++) {
           receiver.receive(packet);
           String notice = new String(packet.getData());
           System.out.println(notice);
        }
        receiver.leaveGroup(channel);
        receiver.close();
     } catch (IOException e) {
        e.printStackTrace();
     } 
  }    public static void main(String[] args) throws IOException {
     new MulticastClient();
   }
}

멀티캐스팅 방식으로 전달되는 DatagramPacket을 받기 위해서 MulticastSocket 객체를 생성했다. MulticastSocket이 생성되면 특정 멀티캐스팅 그룹에 해당하는 패킷을 전송 받기 위해서 joinGroup() 메소드로 멀티캐스팅 그룹 IP를 지정한다.

  String address = "239.0.0.1";
……
        receiver = new MulticastSocket(port);
        channel = InetAddress.getByName(address);
        packet = new DatagramPacket(b, b.length);
        receiver.joinGroup(channel);

멀티캐스팅 방식으로 전달되는 패킷을 MulticastSocket에 있는 receive() 메소드를 이용해서 전달 받아 출력한다(세 번 읽어 들여 출력한다) 그리고 멀티 캐스팅 그룹에 참여를 해지한 후, MulticastSocket을 닫고 종료한다.
 
        for (int i=0; i<3; i++) {
           receiver.receive(packet);
           String notice = new String(packet.getData());
           System.out.println(notice);
        }
        receiver.leaveGroup(channel);
        receiver.close();

방송 서버와 클라이언트 실행

Multicast Server를 실행시킨다. 서버는 0.5초마다 "멀티캐스트 방송이 잘 들리시나요?"라는 문자열을 "239."로 시작하는 내부 멀티캐스팅 그룹에 전송한다.

실행 결과

이때 새로운 명령 창을 실행한 후 다음과 같이 MulticastClient를 실행하면 서버가 보내는 "멀티캐스트 방송이 잘 들리시나요?"라는 문자열을 읽어들여 세번 출력한 후 종료하게 된다.

실행 결과