자바 네트워크 입출력 /UDP,Json

BRINCE·2022년 9월 22일
0

자바 스터디

목록 보기
10/10

UDP 네트워킹

UDP 는 TCP와 다르게 데이터 전송 속도가 상대적으로 빠르다.

일방적으로 수신자에게 데이터를 보내고, 여러 회선을 통해 데이터가 전송되기 때문에 , 데이터가 순서대로 전달되지 않거나, 잘못된 회선으로 인해 데이터 손실이 발생할 수 있다.

예를 들자면 , TCP 는 음식을 바로 가져다주시는 서빙이모라면, UDP같은 경우엔 , 오토바이(회선) 으로 음식을 전달받는 배달부와 같다고 생각해도 될 것 같다.. 🫠

속도가 중요하다면 UDP를 사용하고, 데이터가 확실하게 전달되어야 한다면 TCP를 사용하자.

UDP는 User Datagram Protocol 의 약자이기 때문에 서버와 클라이언트 간에 DatagramPacket을 보내고 받는다.

UDP서버

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 클라이언트

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() 메소드를 호출한다.

정리를 해보자면

  1. UDP 서버 클래스, 클라이언트 클래스 생성
  2. UDP 서버 -> 데이타그램 소켓 생성 후 포트번호 부여
  3. UDP 서버 -> receive()메소드 호출 후 항상 데이터를 받을 준비 함
  4. UDP 클라이언트 -> 데이타그램 소켓 생성
  5. UDP 클라이언트 -> send()로 요청 전송(얻길 원하는 데이터)
  6. UDP 클라이언트 -> receive() 메소드 호출 후 데이터 받을 준비
  7. UDP 서버 -> 요청을 byte로 전달받아 적당한 데이터 타입으로 가공후에 클라이언트에서 원하는 물건을 탐색
  8. UDP 서버 -> 클라이언트에서 원하는 물건을 데이터로 입력후 바이트로 변환, send 로 클라이언트에 전송
  9. UDP 클라이언트 -> receive() 로 전달받은 데이터 getData()로 받은 후에, 해당 패킷 원하는 데이터타입으로 변환 후 출력
  10. 클라이언트/서버 -> 전달 혹은 전송 원하는 데이터 없을시 close()로 종료

이렇게 프로그램을 구현하면 될 것 같다.

JSON 데이터 형식

네트워크 통신에서 가장 많이 사용되는 데이터 형식은 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 얻기
profile
자스코드훔쳐보는변태

0개의 댓글