UDP 는 TCP와 다르게 데이터 전송 속도가 상대적으로 빠르다.
일방적으로 수신자에게 데이터를 보내고, 여러 회선을 통해 데이터가 전송되기 때문에 , 데이터가 순서대로 전달되지 않거나, 잘못된 회선으로 인해 데이터 손실이 발생할 수 있다.
예를 들자면 , TCP 는 음식을 바로 가져다주시는 서빙이모라면, UDP같은 경우엔 , 오토바이(회선) 으로 음식을 전달받는 배달부와 같다고 생각해도 될 것 같다.. 🫠
속도가 중요하다면 UDP를 사용하고, 데이터가 확실하게 전달되어야 한다면 TCP를 사용하자.
UDP는 User Datagram Protocol 의 약자이기 때문에 서버와 클라이언트 간에 DatagramPacket을 보내고 받는다.
DatagramSocket datagramSocket = new DatagramSocket(50001); //포트
UDP서버는 클라이언트가 보낸 패킷을 항상 받을 준비를 해야한다.
이 역할을 하는 메소드가 receive()이다.
DatagramPacket receivePacket = new DatagramPacket(new byte[1024],1024);
datagramSocket.receive(receivePacket); //패킷 받기
매개값중 첫번째는 데이터를 저장할 배열이고, 두번째는 수신 가능한 최대 바이트 수 이다.
수신된 데이터를 얼을땐
byte[] bytes = receivePakcet.getData();
이렇게 getDate() 메소드를 호출하면 된다.
바이트 수를 얻을땐 getLength();메소드를 호출하면 된다.
데이터가 문자열이라면 String생성자로 인코딩 할 수 있다.
String data = new String(bytes,0,num,"UTF-8");
반대로 데이터를 받는것이 아닌 서버가 클라이언트에 처리 내용을 보내려면, 클라이언트 IP주소와 Port번호가 필요한데, receive()로 받은 DatagramPacket에서 얻을 수 있다.
SocketAddress socketAddress = receivePacket.getSocketAddress();
이렇게 얻은 객체는 클라이언트로 보낼 패킷을 생성할때, 네번째 매개값으로 사용된다.
DatagramPacket 생성자의 첫번째 매개값은 바이트 배열이고, 두번째는 시작 인덱스, 세번째는 보낼 바이트 수이다.
String data = "데이타";
byte[] bytes = data.getBytes("UTF-8"); //바이트로 변환
DatagramPacket sendPacket = new
DatagramPacket(bytes,0,bytes.length,socketAddress);
//바이트 배열,첫번째 인덱스에 있는걸 보낸다,보낼 바이트 수,보낼 IP와 포트
이제 이걸 send()메소드를 호출에서 클라이언트로 보낼 수 있다.
datagramSocket.send(sendPacket); //서버에서 클라이언트로 전송
더이상 데이터를 수신하지 않고 종료하고 싶을땐 close() 메소드를 호출하면 된다.
UDP클라이언트는 TCP와 다르게 서버소켓과 소켓으로 구별하는게 아닌 동일한 생성자를 사용한다.
DatagramSocket datagramSocket = new DatagramSocket();
//포트 번호는 자동으로 부여된다.
요청을 보낼땐 생성자로 보낼 패킷을 생성한후 send()메소드로 전송하면 된다. (아웃풋스트림과 같다.)
String data = "데이타1";
byte[] bytes = data.getBytes("UTF-8");
DatagramSocket sendPacket = new
DatagramSocket(bytes,bytes.length.new InetScoektAddress("IP",50001);
// 첫번쨰 바이트배열, 두번째 보내고싶은 바이트 수
// 세번째 UDP 서버 IP 와 Port
datagramPacket.send(sendPacket);
//전송
서버에서 언제 처리결과가 올지 모르니 항상 준비를 하기 위해 receive()메소드를 호출한다.
마찬가지로 서버와 연결을 종료할땐 close() 메소드를 호출한다.
정리를 해보자면
이렇게 프로그램을 구현하면 될 것 같다.
네트워크 통신에서 가장 많이 사용되는 데이터 형식은 JSON이다.
{ //객체 표기
"키" : 값, //속성명은 "로 감싸야함.
"키2" : 값 // 값으로는 문자열,숫자,boolean,객체,배열 입력 가능
}
//배열 표기
[항목,항목1,항목2] // 객체표기와 같은 종류의 값 입력 가능
두개 이상의 속성 이 있을땐 객체{} 로 표기하고 , 두개 이상의 값이 있을땐 배열[]로 표기한다.
만약 값이 예를들어 내가 못먹는 여러가지의 음식 종류라면 배열을 사용하고, 내 미국 휴대폰번호와 한국 휴대폰번호가 필요하다면 {}로 감싸주면 된다.
JSONObject root = new JSONObject();
root.put("name","감자바"); //속성 추가
JSONObject tel = new JSONObject();
tel.put("us","3155313531");
tel.put("kor","01000000000");
root.put("tel",tel); //root json에 tel 자체를 넣음
JSONArray fruit = new JSONArray(); // 배열 생성
fruit.put("Apple");
fruit.put("Orange");
root.put("fruit",fruit); //root에 배열 추가
String json = root.toString(); //json 얻기