UDP(User Datagram Protocol, 비연결 지향적 프로토콜)는 데이터를 주고받을 때 연결 절차를 거치지 않고, 발신자가 일방적으로 데이터를 발신하는 방식이다.
java.net.DatagramSocket과 java.net.DatagramPacket 클래스를 제공하고 있다. DatagramSocket은 발신점과 수신점에 해당하는 클래스이고, DatagramPacket은 주고받는 패킷 클래스이다.
DatagramSocket 객체는 다음과 같이 생성한다.DatagramSocket datagramSocket = new DatagramSocket();
byte[] 배열로 생성하는데, 문자열인 경우 다음과 같이 UTF-8로 인코딩해서 byte[] 배열을 얻으면 된다.byte[] byteArr = data.getBytes("UTF-8");
DatagramPacket을 생성해보자.DatagramPacket 생성자의 첫 번째 매개값은 보낼 데이터인 byte[] 배열이고, byte[] 배열에서 보내고자 하는 항목 수이다.length 값으로 대입하면 된다. SocketAddress이다. SocketAddress는 추상 클래스이므로 하위 클래스인 InetSocketAddress 객체를 생성해서 대입하면 된다.DatagramPacket을 생성하는 코드이다.byte[] bytearr = data.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(byteArr, byteArr.length, new InetSocketAddress("localhost", 5001));
DatagramPacket을 매개값으로 해서 DatagramSocket의 send() 메소드를 호출하면 수신자에게 데이터가 전달된다.datagramSocket.send(packet);
DatagramSocket을 닫기 위해 close() 메소드를 호출한다.datagramSocket.close();
DatagramSocket 객체는 다음과 같이 바인딩할 포트 번호를 매개값으로 지정하고 생성해야 한다.DatagramSocket datagramSocket = new DatagramSocket(5001);
DatagramSocket이 생성되었다면 다음과 같이 receive() 메소드를 호출해서 패킷을 읽을 준비를 한다. receive() 메소드는 패킷을 받을 때까지 블로킹되고, 패킷이 도착하면 매개값으로 주어진 DatagramPacket에 패킷 내용을 저장한다.datagramSocket.receive(datagramPacket);
DatagramPacket 객체를 생성해보자. DatagramPacket datagramPacket = new DatagramPacket(new byte[100], 100);
receive() 메소드로 패킷을 읽었다면 DatagramPacket의 getData() 메소드로 데이터가 저장된 바이트 배열을 얻어낼 수 있다. getLength()를 호출해서 읽은 바이트 수를 얻을 수 있다. 받은 데이터가 인코딩된 문자열이라면 다음과 같이 디코딩해서 문자열을 얻으면 된다.String data = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
DatagramPacket의 getSocketAddress()를 호출하면 발신자의 SocketAddress 객체를 얻어낼 수 있어, 발신자에게 응답 패킷을 보낼 때 send() 메소드에서 이용할 수 있다.SocketAddress socketAddress = packet.getSocketAddress();
receive() 메소드를 반복적으로 호출해야 한다. receive() 메소드가 블로킹되어 있는 상태에서 DatagramSocket의 close()를 호출하면 된다. 이 경우 receive() 메소드에서 SocketException이 발생하게 되고, 예외 처리 코드에서 작업 스레드를 종료시키면 된다.datagramSocket.close();
이것이 자바다 책