본문 바로가기

Project

데이터 관리 서버 만들기 - 4) 프로토콜 정의 및 적용

728x90

1단계 - 프로토콜에 맞춰 게시글 데이터의 저장을 요청한다.

  • .domain.Medicine 클래스 가져오기
  • .domain.Plant 클래스 가져오기
  • .domain.Like 클래스 가져오기
  • .domain.Member 클래스 가져오기
  • .domain.MailBox 클래스 가져오기
  • .ClientApp 변경
    • addBoard() 메서드 추가
    • 프로토콜에 맞춰 Board 객체를 JSON 데이터로 바꿔 서버에 보내기
    • 서버의 응답 결과를 출력하기
public class ClientApp {

  public static void main(String[] args) throws Exception {
    System.out.println("[PMS 클라이언트]");

    System.out.println("1) 서버와 연결 중");
    Socket socket = new Socket("127.0.0.1", 8888); // 서버와 접속이 이루어지면 리턴한다.

    System.out.println("2) 서버와 연결되었음");

    PrintWriter out = new PrintWriter(socket.getOutputStream());
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    while (true) {
      String input = Prompt.inputString("명령> ");

      if (input.equals("/freeBoard/add")) {
        addFreeBoard(out,in);

      } else if (input.equals("/freeBoard/detail")) {
        detailFreeBoard(out,in);

      } else {
        out.println(input);
        out.flush();

        String result = in.readLine();  // 서버에서 한 줄의 문자열을 보낼 때까지 기다린다.
        System.out.println(">>> " + result);
      }

      if (input.equalsIgnoreCase("quit")) {
        break;
      }
    }

    System.out.println("3) 서버와의 접속을 끊음");
    out.close();
    socket.close();

    Prompt.close();
  }


  private static void addFreeBoard(PrintWriter out, BufferedReader in) throws Exception {
    out.println("/freeboard/add");

    FreeBoard freeboard = new FreeBoard();
    freeboard.setNo(1);
    freeboard.setTitle("제목1");
    freeboard.setContent("내용1");
    freeboard.setRegisteredDate(Date.valueOf("2021-1-1"));

    Member m = new Member();
    m.setNo(100);
    m.setName("aaa");
    m.setEmail("aaa@test.com");

    freeboard.setWriter(m);

    out.println(new Gson().toJson(freeboard));

    out.flush();

    String result = in.readLine();
    System.out.println("===>" + result);
  }

  private static void detailFreeBoard(PrintWriter out, BufferedReader in) throws Exception {
    out.println("/freeboard/detail");

    HashMap<String,Object> map = new HashMap<>();
    map.put("no", 100);


    String jsonStr = new Gson().toJson(map);
    System.out.println(jsonStr);

    out.println(jsonStr);
    out.flush();

    System.out.println(in.readLine());

    String result = in.readLine();
    FreeBoard freeboard = new Gson().fromJson(result, FreeBoard.class);
    System.out.println(freeboard);

  }
}

 

1단계 - 프로토콜에 맞춰 게시글 데이터의 저장 요청을 처리한다.

  • .ServerApp` 변경
    • 저장 성공 시 success 응답을 보낸다.
    • 저장 실패 시 fail 응답을 보낸다.
  • -프로토콜에 맞춰 JSON 형식으로 받은 데이터를 Board 객체로 변환하여 저장한다.

 

public class ServerApp {

  public static void main(String[] args) throws Exception {
    System.out.println("[PMS 서버]");

    System.out.println("1) 서버 소캣 준비");
    ServerSocket serverSocket = new ServerSocket(8888);

    System.out.println("2) 클라이언트의 접속을 기다림");
    Socket socket = serverSocket.accept(); // 클라이언트가 접속하면 리턴한다.

    System.out.println("3) 클라이언트가 접속했음");

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(socket.getOutputStream());

    while (true) {
      String command = in.readLine(); // 클라이언트에서 한 줄의 문자열을 보낼 때까지 기다린다.
      System.out.println("===> " + command);

      if (command.equalsIgnoreCase("quit")) {
        out.println("goodbye");
        out.flush();
        break;

      } else if (command.equals("/freeboard/add")) {
        addFreeBoard(out, in);

      } else if (command.equals("/freeboard/detail")) {
        detailFreeBoard(out, in);

      } else {

        out.println(command);
        out.flush();
      }
    }

    System.out.println("4) 클라이언트와의 접속을 끊음");
    out.close();
    in.close();
    socket.close(); 

    System.out.println("5) 서버 소켓 종료");
    serverSocket.close(); // 더 이상 클라이언트의 접속을 수용하지 않는다.
  }

  private static void addFreeBoard(PrintWriter out, BufferedReader in) throws Exception {
    String jsonStr = in.readLine();

    FreeBoard freeboard = new Gson().fromJson(jsonStr, FreeBoard.class);

    System.out.println(freeboard);

    out.println("success");
    out.flush();
  }

  @SuppressWarnings("unchecked")
  private static void detailFreeBoard(PrintWriter out, BufferedReader in) throws Exception {
    String jsonStr = in.readLine();

    HashMap<String,Object> map = new Gson().fromJson(jsonStr, HashMap.class);
    System.out.println(map);

    FreeBoard freeboard = new FreeBoard();
    freeboard.setNo(2);
    freeboard.setTitle("제목1xxxx");
    freeboard.setContent("내용1xxxx");
    freeboard.setRegisteredDate(Date.valueOf("2021-1-1"));

    Member m = new Member();
    m.setNo(101);
    m.setName("aaaxxxx");
    m.setEmail("aaaxxxx@test.com");

    freeboard.setWriter(m);

    out.println(new Gson().toJson(freeboard));
    out.flush();
  }
}

hashmap으로 detail 변경을 보여줌