2011년 6월 10일 금요일

자바의 데이터그램 프로그래밍(Datagram Programming)


UDP(User Datagram Protocol) 방식의 데이터그램 프로그래밍에 대해서 살펴보기로 하자. 네트워크 프로그래밍 단원에서 이미 언급하였지만 이전까지 배운 TCP 소켓 프로그래밍과는 다르게 뭐하나 믿고 신뢰할 구석이 없는 방식이라 생각하면 된다. 너무 매정할지 모르나 메세지 송신중에 데이터가 손실될수도 있고 도착했는지 안했는지 확신할수도 없을뿐더러 중복될수도 있고 순서대로 갈지도 알수 없는데 한마디로 상대방이 데이터를 제대로 받았는지에 대한 어떠한 검사도 수행하지 않는다. 그런데 이걸 왜 알아야되는가? 상황에 따라서 이렇게 신뢰성이 낮은데도 불구하고 빠르게 교신을 요하는 경우(?)가 있을때가 있는데 그럴때 사용하는 것이 바로 데이터그램 프로그래밍이다. 다르게 말하면 순서대로 오지 않아도 크게 지장이 없거나 메세지가 순서대로 오지 않아도 괜찮고 처리시간을 단축하기 위한 네트워크 프로그램에 적합하다고 할수 있겠다. 예를 들어 데이터의 품질과 상태보다 빠르고 연속성이 중요한 스트리밍 서비스를 제공하는 인터넷 전화나 인터넷 방송같은 동영상 스트리밍 서비스를 구현할때 어울리는 방식이라 생각하면 이해가 될것이다.


위의 그림은 UDP 데이터그램의 구조(Structure)를 표현한 것이다. 자바의 프로그래밍 관점에서 데이터그램 프로그래밍과 소켓 프로그래밍의 큰 차이점을 들어보자면 데이터그램 프로그래밍에서는 목적지에 대한 정보를 갖고 전송한다는 점과 데이터를 바이트로 전환한 패킷으로 송수신한다는 점 그리고 소켓 프로그래밍에서의 서버소켓처럼 따로 연결을 관리하는 장치는 없고 대신 데이터그램 소켓에서 방금 말한 데이터그램 패킷을 송수신하기 위한 소켓 기능을 제공한다는 점이 크게 다르다고 할수 있겠다. 덧붙여 말하자면 데이터그램 프로그래밍에서는 서버소켓이 없으므로 클라이언트로부터 오는 데이터그램 패킷을 데이터그램 소켓에서 무조건적으로 받아들여 읽고 쓴다. 데이터그램 프로그래밍에 대한 설명은 이 정도로 하고 이제 예제를 통해서 자바에서는 데이터그램을 네트워크상에서 어떻게 사용하는지 알아보기로 하겠다.

Test62Server.java


Test62Client.java

자 연달아서 데이터그램을 사용할 서버(Test62Server.java) 프로그램과 클라이언트(Test62Client.java) 프로그램이다. 예제를 보면 알겠지만 메세지를 받았네 연결이 되어있네 이런 문구는 여러분의 이해를 돕기 위해 필자가 프로그램에 삽입한 것이지 그 이상을 기대(?)하지는 말기 바란다. 초반에 얘기했지만 자신있게 확신하고 얘기할수는 없는 것이나 우리가 무슨 대용량의 데이터 품질을 요하는게 아니니 뭐 그리 큰 지장은 없이 원활하게 돌아가는구나 생각하기 바란다.

DatagramSocket
DatagramPacket

그럼 이제 예제의 서버 프로그램을 설명하겠다. 저번에 배운 소켓 프로그래밍과 하는 내용은 별반 다를게 없다. 다만 데이터그램을 이용한 점이 다르니 저번 시간을 헛되이 보내지 않았다면 그리 어려울건 없을 것이다. 우리가 데이터그램 프로그래밍에서 알아야할 핵심 클래스로는 위의 데이터그램 소켓 클래스와 데이터그램 패킷 클래스를 들수 있겠다. 서버에서는 데이터그램 소켓을 이용해 특정 포트를 열어두고 데이터그램 패킷을 보내거나 받기위한 준비를 하는데 데이터그램 소켓에 있는 receive( ) 메소드로 보내는 사람의 IP 주소와 포트번호도 함께 들어있는 패킷을 받는다. 받은 패킷을 바이트 배열로 전환하는 과정(?)을 거쳐서 다시 클라이언트로 보내고 처리를 마친다. 무한 for 룹을 돌렸으므로 계속해서 이런 과정이 반복된다. 본 예제는 서버를 셧다운(?) 하지 않는한 클라이언트의 요청을 계속적으로 처리하도록 되어있다. 이런 프로그램의 흐름만 알면 본 예제에 주석이 자알~ 달려있으니 쉽게 이해가 될 것이다.

그럼 이번엔 클라이언트 프로그램을 보기로 하자. 역시 데이터그램 소켓을 이용해 패킷을 보낼 준비를 한다. 보낼 내용을 키보드를 통해 유저에게서 입력받고 내용을 바이트 배열로 전환하여 내용과 사이즈 그리고 보내는 곳의 주소와 포트를 함께 패킷에 담아 서버로 전송한다. 그리고 서버에서 다시 보내올 패킷을 받기 위해 아까처럼 데이터그램 소켓 클래스에 있는 receive( ) 메소드를 이용하여 서버로부터 바이트로 된 패킷을 받아 문자열로 전환하여 화면에 프린트하고 다음 메세지를 유저로부터 기다린다. 아무것도 입력하지 않으면 데이터그램 소켓을 종료하고 프로그램을 끝내는 프로그램이다.



예제를 위와같이 순서대로 실행해서 살펴보면 위와 비슷한 결과(?)를 얻을수 있을 것이다. TCP 소켓 프로그래밍을 정복(?)한 여러분이라면 오늘 배운 UDP 데이터그램 프로그래밍도 그리 어렵지 않았을 것이다. 프로그램을 보다시피 패킷을 송수신할때 바이트 배열을 이용하는게 특이한 점이니 어떻게 바이트를 이용해서 주고 받는지 주의깊게 관찰하기 바란다. 그래도 정리가 안되는 안타까운 이들(?)을 위해 떠나기에 앞서 그림 한장을 아래에 남긴다. 잘 보고 오늘 강의를 잘 정리하기 바란다.^^

댓글 없음:

댓글 쓰기