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 > 자바 네트워크 프로그래밍' 카테고리의 다른 글
Runnable을 사용한 MD5 다이제스트 생성방법 (0) | 2016.12.24 |
---|---|
HTTP (0) | 2016.12.24 |
소켓 통신 (어플리케이션) (0) | 2016.12.24 |
Java 소켓 통신(서버) (0) | 2016.12.24 |
java 소켓 통신 (보안소켓) (0) | 2016.12.24 |