멀티캐스트 프로그래밍
출처 : http://lococo.sch.ac.kr/repository/notes/java_4/j4_0603.html
이 절에서는 데이터그램 프로그램의 대표적인 응용중 하나인 멀티캐스트 프로그램 방법에 대해 알아봅니다. 그리고 이를 시험하는 프로그램으로 일기예보를 송신하고 수신하는 프로그램을 작성해봅니다.
※ 브로드캐스트
◆ 방송
브로드캐스트(broadcast)란 원래 방송을 의미합니다. 방송의 특징은 하나의 방송국이 지정된 수신자 없이 무조건 외부로 데이터를 송신하면, 수신을 원하는 자만이 이 데이터를 받아봅니다.
여기서 수신자가 어떻게 방송을 수신하는지 알아볼 필요가 있습니다. 수신자는 방송을 수신할 수신기(라디오나 TV)가 필요합니다. 단순히 수신기를 튼다는 것으로 특정 방송을 수신할 수 있는 것이 아니라, 방송에는 고유한 주파수 혹은 채널이 있어 수신자는 자신의 수신기를 이 주파수나 채널에 맞추어야 그 방송을 수신할 수 있습니다.
◆ 방송의 구성 요소
여기서 우리는 브로트캐스트, 즉, 방송의 구성요소를 정리해볼 수 있습니다.
∙송신기
∙채널
∙수신기
◆ 방송의 작동 원리
그리고 브로드캐스팅의 작동 원리를 정리해보겠습니다.
송신자가 송신기를 통해 고유 채널에 맞는 방송 데이터 송신.
→ 수신자가 수신기를 틀고 원하는 방송 채널에 맞춤.
→ 방송 수신
◆ 방송의 특성
이러한 방송의 특성은 하나의 서비스 제공자가 불특정 다수에게 서비스를 제공한다는 것과, 서비스를 받는 클라이언트는 서비스 수여에 수동적이란 점입니다. 수신자가 원하든 원하지 않든 데이터는 전송되고, 수신을 원한다면 가져가라는 식입니다. 수신자가 능동적으로 데이터를 요청해 받을 수 없습니다.
또한 방송을 통해 전달하는 데이터는 불특정 다수에게 전하는 것이므로 그 데이터가 목적지에 확실히 전달되도록 신경쓸 필요가 없고, 보안을 고려할 필요도 할 수도 없습니다. 난시청 지역에서는 방송을 들을 수 시청할 수 없지 않습니까. 방송을 잘 받는 것은 수신자 책임입니다.
이와 같이 방송은 일반적인 통신과 다른 매우 독특한 메커니즘과 특성을 갖는데, 다른 통신들도 이 방송의 원리를 이용한다면 그것은 브로드캐스트입니다. 즉, 우리가 지금부터 하고자 하는 브로드캐스트 컴퓨터 네트웍은 이 방송의 원리를 그대로 적용한 것입니다.
이에 반해 사용자가 요구하는 비디오를 제공하는 VOD 같은 서비스는 방송이 컴퓨터 통신의 원리를 이용하는 것이겠죠.
■ 자바 브로드캐스트
컴퓨터 통신에서 브로드캐스트를 구현하기 위해서는 방송과 동일한 요소와 특성을 갖추어야 합니다.
자바에서는 브로드캐스트라는 용어 대신 멀티캐스트multicast란 용어를 사용합니다. 아날로그가 아닌 디지털 통신인 컴퓨터 통신에서는 아날로그 용어인 브로드broad보다 멀티multi가 적절한 표현입니다.
◆ 멀티캐스트의 구성 요소
∙송신 서버 : 방송의 송신기 구실을 합니다.
∙채널 IP 어드레스 및 포트 : 방송의 채널 구실을 합니다.
∙수신 클라이언트 : 방송의 수신기 구실을 합니다.
◆ 멀티캐스트의 작동 원리
송신 서버가 특정 채널 IP 어드레스 및 포트에 데이터그램 패킷 송신
→ 수신 클라이언트가 수신을 원하는 채널 IP 어드레스 및 포트에 연결.
→ 멀티캐스트 데이터그램 패킷 수신
◆ 채널 IP 어드레스와 포트번호
컴퓨터 통신을 브로드캐스트하기 위해서는 고유한 채널이 필요합니다. 전자기파를 신호 매체로 하는 방송에서는 데이터 신호를 싣는 반송파carrier의 주파수를 채널로 정하는데, 컴퓨터 통신에서도 이 원리를 이용해 패킷 헤더에 고유 채널 정보를 넣도록 브로드캐스트 프로토콜을 규정하면 될 것입니다.
그런데 여기서 방송 통신과 컴퓨터 통신의 근본적 차이를 생각해보아야 합니다. 방송 통신의 경우 통신 전달 매체는 공중이며 신호는 전자기파를 이용합니다. 그런데 이 전자기파는 파동의 중첩 원리를 이용해 여러 채널의 신호가 섞이더라도 복조demodulation를 통해 서로 분리해낼 수 있습니다. 또한 일단 송출된 신호는 빠른 속도(빛 속도)로 전달되고 수신되지 않은 전파는 어딘가로 흡수되어 사라집니다.
그러나 컴퓨터 통신은 전달 매체가 통신선이고 전달 신호도 전자 신호라 마치 도로 위를 자동차가 달리는 형상입니다. 또한 일단 통신선으로 나간 신호는 누군가 받아주지 않으면 계속 통신선 위를 정처없이 돌아다닙니다. 물론 결국에는 파워가 약해져 사라져 버리긴 하지만. 만약 방송통신처럼 송신서버가 목적지 없이 데이터를 네트웍에 쏟아버리고 누군가 원하는 노드에서 이 지나가는 데이터를 잡아낸다면, 인터넷은 온통 떠돌아다니는 신호들로 꽉 차 기능이 마비되어버릴 것입니다.
따라서 멀티캐스트를 위해 다른 방법이 필요한데, 그것은 멀티캐스트 중계소를 하나 만드는 것입니다. 그리고 멀티캐스트 서버는 뉴스를 담은 데이터그램 패킷을 일단 이 중계소로 보냅니다. 한편 방송을 듣고싶은 수신 클라이언트는 이 중계소로부터 데이터그램 패킷을 받음으로써 수신을 합니다. 그러니까 이 중계소의 IP 에드레스와 포트번호가 하나의 멀티캐스트 채널 구실을 합니다.
여기서 한 가지 의문은 수신 클라이언트가 중계소에 연결하여 데이터그램 패킷을 받는 것과 서버로부터 직접 받는 것이 어떻게 다른가 하는 점일 것입니다.
사실 어차피 멀티캐스트도 컴퓨터 통신을 사용한다는 점에서 근본적으로 차이는 없습니다. 다만 개념적으로만 방송 흉내를 낸 것뿐입니다. 굳이 차이를 들자면 서버와 직접 연결해 데이터그램 패킷을 받아가는 것은 클라이언트가 요청할 때마다 매번 그에 따른 처리를 해야 하지만, 멀티캐스트의 경우는 클라이언트를 생각하지 않고 그저 일정한 시간에 한번 씩 소식을 내보내기만 하면 된다는 점입니다.
그리고 멀티캐스트 채널 구실을 할 중계소가 필요하다고 했는데, 이것이 별도의 호스트가 존재한다는 것은 아닙니다. 중계소란 단지 IP 에드레스와 포트번호에 지정된 추상적인 것일 뿐입니다. 실제는 멀티캐스트 서버 구실을 하는 기계 안에 있습니다.
◆ 멀티캐스트 소켓
멀티캐스트를 수신하기 위해서는 수신기를 켜고 채널을 맞추어야 한다고 했습니다. 자바에서는 멀티캐스트 소켓이 수신기 역할을 합니다.
그러니까 멀티캐스트 소켓을 생성하여 멀티캐스트 채널 포트에 꽂는 것이 곧 수신기를 켜는 것입니다.
가령 멀티캐스트 채널 포트번호가 port 일 때 멀티캐스트 수신기 켜기는 다음과 같이 MulticastSocket 개체를 생성하는 것으로 이루어집니다.
MulticastSocket receiver = new MulticastSocket(port);
◆ 채널 맞추기
자바 멀티캐스트에서 클라이언트의 채널 맞추기는 서버가 개설한 멀티캐스트 채널 IP 어드레스와 포트번호를 맞추는 것입니다. 채널 포트번호 맞추기는 멀티캐스트 소켓을 생성할 때 이미 마쳤고, 이제 채널 IP 어드레스 맞추기만 남았습니다.
만약 채널 IP 어드레스가 channel 이라면 멀티캐스트 클라이언트의 채널 맞추기는 MulticastSocket 클래스의 joinGroup() 메쏘드를 이용하면 됩니다.
receiver.joinGroup(channel);
이는 "나의 수신기(receiver)를 channel 그룹의 한 멤버로 가입한다"는 정도로 해석하면 될 것입니다.
◆ 멀티캐스트 수신
멀티캐스트 수신은 일반 데이터그램 패킷 받기와 동일합니다. 즉, 입력 데이터그램 패킷을 생성하고, 멀티캐스트 소켓을 통해 이를 받으면 됩니다.
◆ 멀티캐스트 수신기 끄기
멀티캐스트 수신을 마쳤으면 수신기를 꺼야 합니다.
수신기 끄기는 수신기로 생성한 멀티캐스트 소켓을 닫으면 됩니다. 그런데 자바 멀티캐스트의 경우는 수신기를 끄기 전에 먼저 가입했던 채널 그룹에서 나가야 합니다.
가령 앞에서처럼
receiver.joinGroup(channel);
로 채널 그룹에 가입했으면 다음 표현문으로 채널 그룹에서 나갑니다.
수신기 끄기는 일반 소켓 닫기와 동일합니다.
receiver.close();
※ MulticastSocket 클래스
여기서는 멀티캐스트 수신기 역할을 할 멀티캐스트 소켓을 생성하고 이를 조작하는 메쏘드들을 포함한 MulticastSocket 클래스에 대해 알아봅니다.
멀티캐스트 데이터그램 소켓은 IP 멀티캐스트 패킷을 주고받는 데 사용합니다. MulticastSocket 클래스는 DatagramSocket 소켓을 확장한 것으로, 인터넷 상의 멀티캐스트 호스트 그룹에 가입하는 기능을 추가시킨 것입니다.
멀티캐스트 그룹은 클래스 D 의 IP 어드레스와 표준 UDP 포트번호에 의해 규정됩니다. D클래스 IP 어드레스는 224.0.0.0 에서 239.255.255.255 까지입니다. 그러나 224.0.0.0 는 예약된 주소이므로 일반 프로그램에서 사용할 수 없습니다.
■ 구성자
public MulticastSocket(int port) throws IOException
멀티캐스트 소켓을 생성한 뒤 인자로 지정한 포트에 연결합니다. 이 포트 번호는 브로드캐스트 서버가 개설한 채널 포트 번호와 일치해야 합니다.
이 소켓을 생성할 때 애플리케이션에서 보안관리자를 설치해두었으면, 데이터그램 소켓을 생성하기 전에 인자를 0으로 지정한 checkListen(0) 메쏘드를 호출하여 보안 검사를 한 뒤 문제가 없을 때 이 작업을 진행합니다. 만약 보안문제가 있으면 SecurityException 예외가 던져집니다.
■ 메쏘드
public void joinGroup(InetAddress channel) throws IOException
인자로 지정한 IP 어드레스의 멀티캐스트 채널 그룹 channel에 대해 현재 MulticastSocket 개체를 멤버로 가입시킵니다. 이로써 이 채널을 통해 멀티캐스트 데이터그램 패킷을 받을 수 있습니다.
public void leaveGroup(InetAddress channel) throws IOException
인자로 지정한 IP 어드레스의 멀티캐스트 채널 그룹 channel에서 현재 MulticastSocket 개체를 제외시킵니다.
현재 MulticastSocket 개체를 채널 그룹에 가입시키거나 떠날 때 애플리케이션에서 보안관리자를 설치해두었으면, 이 보안관리자는 먼저 채널 IP 어드레스 channel을 인자로 한 checkMulticast(channel) 메쏘드를 호출하여 보안 검사를 한 뒤 문제가 없으면 후속 작업을 진행합니다.
public void setInterface(InetAddress newCh) throws SocketException
현재 MulticastSocket 의 멀티캐스트 채널 그룹을 새로운 그룹 newCh로 바꿉니다.
※ 멀티캐스트 프로그램의 구성
그러면 자바에서 이러한 컴퓨터 통신 브로드캐스트, 즉, 멀티캐스트 프로그래밍을 어떻게 구현하는지 알아봅시다.
먼저 멀티캐스트 프로그램의 전체 구성을 알아보면 다음과 같습니다.
∙프로토콜 프로그램
∙서버 프로그램
∙클라이언트 프로그램
여기서 간단한 데이터그램 프로그램의 경우 프로토콜 프로그램은 서버
프로그램 안에 흡수시킬 수 있습니다.
그러면 꼭 필요한 서버 프로그램과 클라이언트 프로그램의 구성을 알아보겠습니다.
■ 멀티캐스트 서버 프로그램의 구성
멀티캐스트는 공개된 데이터를 불특정 다수에게 제공하므로 데이터그램 프로그래밍에 기반을 둡니다. 송신 서버 역할을 하기 위해 특별한 조처가 필요한 것은 없고, 다만 멀티캐스트 개념에 맞게 데이터그램 서버 프로그램을 약간 수정하기만 하면 됩니다. 일반 데이터그램 서버 프로그램과 멀티캐스트 서버 프로그램이 크게 다른 점은 멀티캐스트 서버 프로그램은 쓰레드화 할 필요가 있다는 것입니다. 물론 일반 데이터그램 서버 프로그램도 여러 클라이언트와 동시 통신을 위해 다중 서버 쓰레드를 사용하긴 하지만, 멀티캐스트 서버 프로그램의 쓰레드화는 다중 통신을 위한 것이 아니라 데이터그램 패킷을 시간에 따라 규칙적으로 전송하는 송신 제어를 위한 것입니다. 즉, 쓰레드의 잠자기sleep 기능을 이용해 데이터그램 전송 주기를 제어하는 것입니다.
멀티캐스트 서버 프로그램은 크게 다음 과정으로 구성될 것입니다. 여기서 클라이언트로부터의 요청 과정이 없다는 점에 주목하십시오.
1. 데이터그램 소켓 생성 및 연결
2. 송신할 정보 데이터 마련
3. 중계소에 출력 데이터그램 패킷 보내기
1. 데이터그램 소켓 생성 및 연결
DatagramSocket socket = new DatagramSocket(port);
일반적인 데이터그램 프로그램과 마찬가지로 우선 데이터그램 패킷을 전송할 소켓이 필요합니다.
2. 송신할 정보 데이터 마련
송신할 정보 데이터를 마련합니다. 이는 십중팔구 String 형 데이터일 것입니다. 서비스의 종류에 따라 뉴스일 수도, 날씨 정보일 수도, 주가 정보일 수도 있습니다.
어쨌든 결과적으로 서비스 정보 데이터을 버퍼 buf 에 집어넣는 것으로 처리가 끝납니다.
buf = 응답 내용
3. 중계소에 데이터그램 패킷 보내기
송신할 정보 데이터를 담은 출력 데이터그램 패킷을 마련합니다.
이 데이터그램 패킷을 중계소에 보냅니다.
출력 데이터그램 패킷 생성
우선 중계소의 주소(IP 어드레스)를 나타내는 InetAddress 개체를 생성합니다.
중계소의 IP 어드레스로는 D 클래스 어드레스 중 하나를 임의로 택하면 됩니다. 우리는 230.0.0.1 로 택합니다.
InetAddress channel=InetAddress.getByName("230.0.0.1");
이제 이 중계소 주소를 목적지로 하고 포트번호를 port 로 갖는 출력 데이터그램 패킷을 생성합니다.
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
여기서 buf 에는 브로드캐스트 내용이 들어있습니다.
출력 데이터그램 패킷 보내기
socket.send(packet);
■ 멀티캐스트 클라이언트 프로그램의 구성
멀티캐스트 클라이언트 프로그램은 다음 과정을 처리합니다.
1. 멀티캐스트 수신기 만들고 켜기
2. 채널 맞추기
3. 멀티캐스트 데이터그램 패킷 수신
4. 멀티캐스트 수신기 끄기
1. 멀티캐스트 소켓 생성 및 연결
멀티캐스트 수신기receiver 역할을 할 멀티캐스트 소켓을 생성합니다.
MulticastSocket receiver = new MulticastSocket(port);
2. 채널 맞추기
채널 IP 어드레스 구하기
멀티캐스트 데이터그램 패킷을 수신하고자 하는 채널에 대한 채널 IP 어드레스를 멀티캐스트 서버가 지정한 채널 IP 어드레스에 맞추어 구합니다.
InetAddress channel = InetAddress.getByName("230.0.0.1");
채널 그룹에 가입하기
이제 멀티캐스트 수신기 receiver 를 앞의 채널 IP 어드레스에 맞추어 가입합니다.
receiver.joinGroup(channel);
3. 멀티캐스트 수신
입력 데이터그램 패킷 생성
먼저 멀티캐스트 데이터그램 패킷을 받을 수 있도록 입력 데이터그램 패킷을 생성합니다.
DatagramPacket packet= new DatagramPacket(buf, buf.length);
데이터그램 패킷 받기
다음 멀티캐스트 데이터그램 패킷 받기 표현식을 통해 멀티캐스트 수신합니다.
receiver.receive(packet);
입력 데이터 처리
이제 멀티캐스트 서버로부터 받은 데이터를 출력합니다. 이 과정은 출력 방법에 따라 달라집니다.
4. 멀티캐스트 수신기 끄기
채널 그룹 빠져 나가기
멀티캐스트 수신기를 끄기 전에 먼저 들록하였던 채널 그룹에서 빠져 나옵니다.
receiver.joinGroup(channel);
수신기 끄기
이제 끝으로 수신기로 사용한 멀티캐스트 소켓을 닫습니다.
receiver.close();
※ 일기예보 멀티캐스트 프로그램
멀티캐스트 시험 프로그램으로 일기예보 서비스 프로그램을 제작해보겠습니다.
일기예보 소식은 데이터 전달 확실성 보장이 필요없고, 서비스를 받은 즉시 접속을 끊는 것이 바람직하므로 데이터그램 프로그램으로 구현하는 것이 바람직합니다.
또한 일정한 내용(일기예보)을 불특정 다수에게 전송하면 원하는 클라이언트가 이를 받아가는 것으로 충분하니 일기예보는 멀티캐스트 프로그램으로 구현하기에 적절합니다.
■ 멀티캐스트 서버 프로그램
◆ 클래스명 WeatherServer
1. 데이터그램 소켓 생성 및 연결
구성자에서 포트번호 port 에 대한 데이터그램 소켓을 생성하여 연결합니다.
public WeatherServer() throws IOException {
super("BroadcastServer");
socket = new DatagramSocket(port);
}
2. 일기예보 정보 마련
일기예보 정보 텍스트 파일
별도의 news.txt 파일에 일기예보 정보를 한 줄의 텍스트로 담아둡니다.
우리의 시험 프로그램을 위해 news.txt 파일에 다음 내용을 입력해두었습니다.
이 내용을 수시로 바꾸어 일기예보 정보를 변경할 수 있습니다.
맑음, 온도:21도, 습도:51%, 풍속:초속 2m
멀티캐스트 정보 구하기 메쏘드 getNews()
별도로 멀티캐스트 정보를 String 형으로 되돌리는 메쏘드 getNews() 를 정의합니다.
일기예보 정보 파일 news.txt 로부터 정보를 읽어들일 수 있도록, 아 파일에 대한 파일 입력스트림 FileReader("news.txt") 을 생성하여, BufferedReader 로 버퍼화 합니다.
BufferedReader in = new BufferedReader(new FileReader("news.txt"));
이 파일 입력스트림으로부터 한 줄의 스트링 데이터를 읽어들입니다.
String ment = in.readLine();
이 파일로부터 읽어들인 일기예보 정보 텍스트를 되돌립니다.
return ment;
멀티캐스트 데이터그램 패킷 데이터 구하기
일기예보 정보를 담은 멀티캐스트 데이터그램 패킷을 만듭니다.
먼저 멀티캐스트 데이터그램 패킷 내용을 담을 버퍼를 정의합니다. 여기서는 최대 100자까지 (8비트 아스키 문자 기준) 담을 수 있도록 길이 100 의 byte형 배열로 정의합니다.
byte[] buf = new byte[100];
멀티캐스트 정보 구하기 메쏘드 getNews() 를 불러내어 일기예보 정보 스트링을 구합니다.
String ment = getNews();
이 멀티캐스트 정보 스트링 ment 를 byte 형으로 바꾸어 버퍼 buf 에 저장합니다.
buf = ment.getBytes();
3. 중계소에 데이터그램 패킷 보내기
출력 데이터그램 패킷 생성
중계소의 IP 어드레스로 230.0.0.1 를 택해 이에 대응하는InetAddress 개체를 만듭니다.
InetAddress channel=InetAddress.getByName("230.0.0.1");
중계소 주소를 목적지로 하고 포트번호를 port 로 갖는 출력 데이터그램 패킷을 생성합니다.
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
출력 데이터그램 패킷 보내기
socket.send(packet);
4. 데이터 전송 주기 조정
멀티캐스트 데이터는 클라이언트가 언제 이용할지 모릅니다. 따라서 일정한 시간 간격에 한번씩 송신해야 합니다. 이는 Thread 클래스의 sleep() 메쏘드를 이용합니다.
우리는 다음 문장을 통해 duration 시간을 (단위 밀리초) 송신 주기로 합니다.
try { sleep(duration);
} catch (InterruptedException e) { }
5. 소켓 닫기
모든 멀티캐스트 서비스를 마치면 열어두었던 데이터그램 소켓을 닫습니다.
socket.close();
◆ 소스코드
아래는 일기예보 프로그램의 멀티캐스트 서버 프로그램 부분에 대한 소스코드를 보여줍니다.
import java.io.*;
import java.net.*;
import java.util.*;
public class WeatherServer extends Thread {
protected DatagramSocket socket = null;
protected BufferedReader in = null;
private int port = 1236;
protected boolean onAir = true;
private int duration = 2000;
public WeatherServer() throws IOException {
super("BroadcastServer");
socket = new DatagramSocket(port);
}
protected String getNews() {
String ment = null;
try {
in = new BufferedReader(new FileReader("news.txt"));
ment = in.readLine();
} catch (FileNotFoundException e) {
System.err.println("news 파일을 열 수 없습니다.");
} catch (IOException e) {
ment = "서버에 IOException 발생";
}
return ment;
}
public void run() {
while (onAir) {
try {
byte[] buf = new byte[100];
String ment = getNews();
buf = ment.getBytes();
InetAddress channel = InetAddress.getByName("230.0.0.1");
DatagramPacket packet = new DatagramPacket(buf, buf.length, channel, port);
socket.send(packet);
try {
sleep(duration);
} catch (InterruptedException e) { }
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
public static void main(String[] args) throws java.io.IOException {
new WeatherServer().start();
}
}
■ 멀티캐스트 클라이언트 프로그램
◆ 클래스명 WeatherClient
1. 멀티캐스트 소켓 생성 및 연결
MulticastSocket receiver = new MulticastSocket(port);
2. 채널 맞추기
채널 IP 어드레스 구하기
InetAddress channel =
InetAddress.getByName("230.0.0.1");
채널 그룹에 가입하기
receiver.joinGroup(channel);
3. 멀티캐스트 수신 및 처리
멀티캐스트 수신은 for문을 통해 5회 연속 수신합니다.
for (int i = 0; i < 5; i++) {
...
}
먼저 멀티캐스트 데이터그램 패킷 내용을 담을 버퍼를 정의합니다. 여기서는 최대 100자까지 (8비트 아스키 문자 기준) 담을 수 있도록 길이 100 의 byte형 배열로 정의합니다.
byte[] buf = new byte[100];
입력 데이터그램 패킷 생성 : 멀티캐스트 수신 내용을 저장할 입력 데이터그램 패킷을 만듭니다.
packet = new DatagramPacket(buf, buf.length);
일기예보 데이터그램 패킷 받기: 수신기(멀티캐스트 소켓) receiver 를 통해 데이터그램 패킷을 받습니다.
receiver.receive(packet);
일기예보 출력 스트링 구하기
수신 데이터그램 패킷 packet 에서 데이터를 구합니다.
packet.getData()
이 데이터는 byte 배열형입니다.
수신한 일기예보 데이터를 출력하기 위해서는 String 형으로 바꿀 필요가 있습니다. 이는 단순히 byte형 배열을 String 형으로 개체화하면 됩니다.
String inform = new String(packet.getData());
일기예보 출력: 우리는 수신한 일기예보 inform 을 도스창에 표준출력합니다.
System.out.println("[오늘의 날씨] " + inform);
4. 멀티캐스트 수신기 끄기
채널 그룹 빠져 나가기
receiver.joinGroup(channel);
수신기 끄기
receiver.close();
◆ 소스코드
아래는 일기예보 프로그램의 멀티캐스트 서버 프로그램 부분에 대한 소스코드를 보여줍니다.
import java.io.*;
import java.net.*;
import java.util.*;
public class WeatherClient {
public static void main(String[] args) throws IOException {
int port = 1236;
MulticastSocket receiver = new MulticastSocket(port);
InetAddress channel = InetAddress.getByName("230.0.0.1");
receiver.joinGroup(channel);
DatagramPacket packet;
for (int i = 0; i < 5; i++) {
byte[] buf = new byte[100];
packet = new DatagramPacket(buf, buf.length);
receiver.receive(packet);
String inform = new String(packet.getData());
System.out.println("[오늘의 날씨] " + inform);
}
receiver.leaveGroup(channel);
receiver.close();
}
}
'Development > Java' 카테고리의 다른 글
RMI 서버/Client 실행시 UnmarshalException 발생 해결 방법 (0) | 2019.06.17 |
---|---|
[Spring Framework] java.util.zip.ZipException: invalid LOC header (bad signature) (0) | 2019.06.16 |
Java mail. 파일첨부하기. (0) | 2019.06.16 |
JAVA를 이용한 메일 보내기 (1) | 2019.06.16 |
[Eclipse] AnyEdit 플러그인 설치 방법 (0) | 2019.06.16 |
댓글