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

UPD 프로그래밍

경진 2008. 7. 19. 16:20
UDP를 이용한 프로그래밍 방법

UDP(User Datagram Protocol)는 데이터그램 통신 프로토콜이라고도 한다.
UDP는 TCP와는 다르게 비연결성(connectionless) 프로토콜이다. 즉, TCP 처럼 미리 연결을 맺고 통신하는 방식이 아니다.

데이터그램은 보통 패킷(packet)이란 용어로 교체되어 사용된다. 패킷이란 인터넷 내에서 운반되어야 할 메시지 단위이다.

UDP는 패킷을 보낼 때마다 수신측의 주소와 로컬 파일 설명자를 함께 전송해야 한다. 이런 이유로 UDP는 전송해야 할 데이터 외에 추가적인 데이터가 함께 전송되어야한다. 또한 UDP는 TCP와는 다르게 비연결성이기 때문에 패킷이 수신 측에 전송한 순서대로 도달하지 않는 문제가 발생할 수도 있다. (그러나 네트워크가 근거리일 경우, 전송한 순서대로 패킷이 전달되지 않는 경우는 극히 드물다) 또한 TCP는 한번 연결을 맺으면 연속적으로 데이터를 주고 받을 수 잇기 때문에 연결이 끊어지지 않는 한 대용량의 데이터도 주고받을 수 있다. 하지만 UDP의 경우에는 데이터의 크기가 64KB로 제한되어 있다는 단점이 있다.

그렇다고 UDP 방식에 문제만 있는 것은 아니다. TCP의 경우에는 연결지향 방식이기 때문에 연결에 필요한 시간이 필요하다. 반면 UDP는 연결되지 않은 상태로 전송되기 때문에 좀더 빠르게 데이터를 주고 받을 수 있다.

UDP는 비연결성이기 때문에 연결성인 TCP에 비하면 신뢰성이 떨어진다. 따라서 TCP는 미리 정해지지 않은 길이의 데이터를 신뢰성있게 송수신하기 위한 네트워크 프로그래밍에 알맞으면, UDP는 연결을 맺지 않은 상태로 빠르게 데이터를 주고 받을 수 있기 때문에 복잡하지 않고, 과부하가 많이 발생하지 않은 곳에 적합하다.

따라서 UDP는 근거리 통신망에서 복잡하지 않은 데이터를 주고받을 때 유리하다.

UDP를 이용한 프로그래밍을 하려면 클라이언트와 서버 모두 java.net 패키지 안에 있는 DatagramSocket 객체를 생성해야 한다. 또한 클라이언트와 서버는 데이터를 주고받기 위해서 DatagramPacket 객체를 이용해야 한다.

DatagramSocket은 DatagramPacket을 보내거나 받을 때 모두 필요하다. 따라서 클라이언트와 서버 양쪽 모두 에서 DatagramSocket을 생성해야 한다.

UDP 방식으로 통신하는 클라이언트와 서버에 대한 동작 순서다. 서버는 클라이언트로 부터 정보를 받아들이기 위해서 특정 포트에서 동작하는 DatagramSocket을 생성한다. 그리고 receive() 메소드에 비어있는 DatagramPacket 객체를 인자로 지정한 후 클라이언트에서 데이터그램(패킷)을 보낼 때까지 대기한다.

UDP 방식의 클라이언트와 서버의 동작 순서

UDP 방식의 클라이언트와 서버의 동작 순서

클라이언트는 데이터를 전송하기 위해서 일단 DatagramSocketㅇ르 생성해야 한다. 서버와는 다르게 동작하는 포트는 지정하지 않는다. 클라이언트는 전송할 데이터그램 패킷에 서버의 DatagramSocket의 동작 포트, 서버의 IP, 전송할 데이터, 전송할 데이터 길이 등을 지정한 후 send() 메소드를 이용해서 전송하기 때문이다.

데이터그램 패킷은 서버의 IP와 포트 값을 통해 서버에 전달된다. 서버는 이렇게 전달된 패킷을 receive()메소드를 통해서 읽어 들인 후, 읽어 들인 패킷을 통해서 전송한 클라이언트의 IP, 동작포트, 데이터, 데이터 길이를 구할 수 있다. 그리고 구한 값을 이용해서 전송할 패킷을 새롭게 구성하며, 서버쪽에서는 클라이언트와 마찬가지로 DatagramPacket에 있는 send() 메소드를 이용해서 클라이언트에 다시 전송한다.

클라이언트도 서버와 마찬가지로 DatagramPacket에 있는 receive() 메소드를 이용해서 서버가 반송한 데이터를 전달 받을수 있게 된다.

모든 작업이 끝나면 서버와 클라이언트는 모두 DatagramSocket에 있는 close()메소드를 호출하면 된다.