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();
이것이 자바다 책