UDP 통신


UDP소켓은  호스트 사이의 고유의 연결이라는 개념이 없다.


UDP소켓은 또한 TCP처럼 단일 연결을 위해 할당되지 않는다.


TCP소켓은 네트워크 연결을 스트림처럼 다룬다소켓에서 가져온 입출력 스트림을 사용해 데이터를 보내거나 받는다UDP 이러한 방식을 지원하지 않고

항상 개별 데이터그램 패킷으로 작업해야한다단일 데이터 그램에 채워 넣는 모든 데이터는 단일 패킷으로 전송되고덩어리채 유실되기도 한다.

-> 패킷들 사이에 연관성이 없으며누가 먼저 보내져야 하는지에 대한 근거가 없다.

 

UDP에서 전송될 주소를 포함한 데이터그램에 대한 모든 것이 패킷  자체에 저장되어 있기에 소켓은 대기하거나 전송할 로컬 포트만 알고 있으면 된다.

 

자바의 UDP 구현은 DatagramPacket, DatagramSocket으로 나뉜다.

 

DatagramPacket 클래스는 데이터의 바이트를 데이터그램이라고 불리는 UDP 패킷에 채워 놓고 수신 받은 데이터 그램을 꺼낸다.

DatagramSocket UDP 데이터그램을 수신할 뿐만 아니라 전송도 가능하다.

 

데이터를 전송하기 위해서는 데이터를 DatagramPacket 넣고 DatagramSocket 사용하여 패킷을 전송한다.

데이터를 수신하기 위해서는 데이터를 DatagramSocket에서 DatagramPacket 객체를 가져와서 패킷의 내용을 확인한다.

 

 

UDP 클라이언트

TCP 소켓으로 작성하였던 dayTime 반환하는 소켓 서버를 UDP 구현해보자.

 

DatagramSocket socket = new DatagramSocket(0); //포트 0번에 대해 소켓을 연다.

-> TCP 소켓과는 다르게 단지 연결할 로컬 포트만 명시하면 포트번호는 원격 호스트나 주소를 알지 못하지만 자바가 사용가능한 임의의 포트를 선택해 준다.

 

Socket.setTimeout(1000); // 타임아웃을 10 동안 응답이 없을 경우 되도록 설정한다.

 

InetAddress host = InetAddress.getByName("time,dat,net");

DatagramPacket request = new DatagramPacket(new Byte[1], 1, host, 13);

 

Byte[] data = new byte[1024];

DatagramPacket response = new DatagramPacket(data, data.length); //서버의 응답을 수신하는 패킷은 간단히  바이트 배열을 포함한다 버퍼는 전체 응답을 충분히 담을 크기여야 한다버퍼의 크기가 너무 작은 경우 나머지 부분은 잘린다. 1k 충분하다.

 

Socket.send(request);

Socket.receive(response);

 

String daytime = new String(response.getData(), 0, response.getLength(), "US-ASCII");

System.out.println(daytime);

 

 

UDP 서버

Udp 서버는 일반적으로 전송하기 전에 먼저 수신한다는 것과 임의의 포트에 바인드 하지 않는다는 것을 제외하면 UDP클라이언트와 거의 같은 패턴을 따른다.

 

DatagramSocket socket = new DatagramSocket(13); //데이터 그램 소켓을 생성한다.

 

DatagramPacket request = new DatagramPacket(new byte[1024], 0, 1024);  //들어온 데이터를 저장할 바이트 배열과배열에서의 오프셋그리고 저장할 바이트 수를 인자로 제공하는 요청을 수신할 패킷을 만든다.

 

Socket.receive(request); //패킷을 수신한다 메소드는 포트 13번으로 UDP 패킷이 도착할  까지 무한히 대기한다.

 

String daytime = new Date().toString() +"\r\n";

Byte[] data = daytime.getBytes("US-ASCII");

InetAddress host = request.getAddress();

Int port = request.getPort();

DatagramPacket response = new DatagramPacket(data, data.length, host, port);

 

Socket.send(response);

 

UDP 자체가 담을  있는 데이터의 최대량은 이론적으로 6 5507바이트이지만실제로는  작다.

-> 따라서 8K 이상의 데이터를 가진 UDP 패킷을 주고 받는 임의의 프로그램은 조심스럽게 다뤄야 한다

-> 나머지 데이터가 잘라서 보내질 수 있다.

'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

+ Recent posts