본문 바로가기
JAVA

UDP 프로그래밍

by 융디's 2024. 4. 27.
728x90
UDP 프로그래밍

UDP 프로그래밍

@2024.04.23

UDP 프로그래밍

💡
자바에서는 java.net packageDatagramSoketDatagramPack 클래스를 사용하여 구현

Echo 프로그래밍(UDP)

💡
클라이언트가 서버에 메시지를 보내면, 서버가 동일한 메시지를 클라이언트에게 되돌려주는 간단한 네트워크 애플리케이션이다.
  • 연결이 없는 통신을 사용하므로, 서버와 클라이언트 간의 연결 설정 없이 바로 데이터를 송수신

[ Echo Server 구현 ]

  1. DatagramSocket 객체 생성
    • 서버 DatagramSocket 객체를 생성하여 특정 포트에서 클라이언트의 데이터 그램을 기다린다.
    DatagramSocket datagramSocket = new DatagramSocket(8888);
  1. 데이터 수신 및 응답
    • DatagramPacket을 사용하여 클라이언트로부터 데이터를 받는다.
    • 그 후 동일한 데이터를 클라이언트에게 다시 보낸다
    while(true){
          byte[] receiveData = new byte[1024];
          byte[] sendData;
          DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
          datagramSocket.receive(receivePacket);
    
          String message = new String(receivePacket.getData()).trim();
          InetAddress clientAddress = receivePacket.getAddress();
          int port = receivePacket.getPort();
    
          DatagramPacket sendPacket = new DatagramPacket(message.getBytes(),message.getBytes().length, clientAddress,port);
          datagramSocket.send(sendPacket);
      }
  1. 소켓 종료
    • 서버는 더 이상 데이터 송수신이 필요 없을 때 DatagramSocket 을 닫아 자원을 해제한다.
    datagramSocket .close();
    • 전체 코드
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      
      public class UDPEchoServer {
          public static void main(String[] args) {
              // UDP 통신 특정 Port에 DatagramSocket 생성
              try {
                  DatagramSocket datagramSocket = new DatagramSocket(8888);
                  while(true){
                      byte[] receiveData = new byte[1024];
                      byte[] sendData;
                      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                      datagramSocket.receive(receivePacket);
      
                      String message = new String(receivePacket.getData()).trim();
                      InetAddress clientAddress = receivePacket.getAddress();
                      int port = receivePacket.getPort();
      
                      DatagramPacket sendPacket = new DatagramPacket(message.getBytes(),message.getBytes().length, clientAddress,port);
                      datagramSocket.send(sendPacket);
                  }
              }catch (Exception e){
                  e.printStackTrace();
              }
          }
      }

[ Echo Client 구현 ]

  1. DatagramSocket 객체 생성
    • 클라이언트는 DatagramSocket 객체를 생성하여 데이터를 전송할 준비를 한다
    DatagramSocket clientSocket = new DatagramSocket();
  1. 데이터 전송 및 응답 수신
    • 클라이언트는 DatagramPacket에 데이터를 담아 서버로 보내고, 서버로부터 동일한 데이터를 받는다.
    BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in);
    //키보드로 입력 받아서
    System.out.print("보낼 메시지를 입력하세요 >> ");
    String message = keyboard.readLine();
    
    // 서버로 보내기
    DatagramPacket sendPacket = new DatagramPacket(message.getBytes(),message.getBytes().length, IpAddress, 8888);
    clientSocket.send(sendPacket);
    
    // 서버로부터 받기
    DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
    clientSocket.receive(receivePacket);
    String receiveMessage = new String(receivePacket.getData()).trim();
    
    System.out.println(receiveMessage);
  1. 소켓 종료
    • 데이터 송수신이 끝나면 클라이언트는 DatagramSocket을 닫는다.
    clientSocket.close();
    keyboard.close();
    • 전체 코드
      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      
      public class UDPEchoClient {
          public static void main(String[] args) {
              try(DatagramSocket clientSocket = new DatagramSocket();
                  BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
              ){
                  // 서버의 주소 설정
                  InetAddress IpAddress = InetAddress.getByName("localhost");
                  byte[] sendData;
                  byte[] receiveData = new byte[1024];
      
                  //키보드로 입력 받아서
                  System.out.print("보낼 메시지를 입력하세요 >> ");
                  String message = keyboard.readLine();
      
                  // 서버로 보내기
                  DatagramPacket sendPacket = new DatagramPacket(message.getBytes(),message.getBytes().length, IpAddress, 8888);
                  clientSocket.send(sendPacket);
      
                  // 서버로부터 받기
                  DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
                  clientSocket.receive(receivePacket);
                  String receiveMessage = new String(receivePacket.getData()).trim();
      
                  System.out.println(receiveMessage);
              }catch (Exception e){
                  e.printStackTrace();
              }
          }
      }
      

728x90

'JAVA' 카테고리의 다른 글

람다식  (0) 2024.05.03
익명 객체  (0) 2024.04.27
TCP 프로그래밍  (1) 2024.04.27
네트워크의 기본  (0) 2024.04.27
멀티 스레드  (2) 2024.04.27