2023.05.02 TIL

2023. 5. 2. 19:54TIL(Today I Learned)

[1] : 포트로 서버 만드는 법

package main;

import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.net.InetSocketAddress;

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) throws IOException {

        //8765 포트에서 동작하는 어떤 소켓
        //backlog는 0으로 주면 기본값으로 세팅됨
        //backlog는 서버가 한개당 몇개까지 처리할지에 대한 값이다
        int port = 8765;
        int backlog = 0;



        //HttpSever 생성
        HttpServer hs = HttpServer.create(new InetSocketAddress(port), backlog);

        //컨텍스트 설정 및 핸들러 등록
        //경로에 테스트라는 경로로 요청이 오면 그에 따른 핸들러가 작동된다
        //서버가 만들어짐(1.테스트라는 요청이 들어옴)
        //2.그 객체에 찾아가서 handle이라는 메소드를 호출해줌
        //3.객체가 가지고 있는 handle 메소드를 호출
        //4. 객체가 handle이라는 메소드를 가지고 있다는 보장이 있는가?
        //5. 그렇게 만들면 됨(서버의 목적은 이러한 요청이 들어왓을 때, 객체에 들어가서
        //핸들이라는 메소드를 호출하는 것이 이 서버의 계획임
        //반드시 객체는 handle이라는 메소드를 가지고 있어야 함
        //handle이라는 메소드를 무조건 가지게 하려면, 인터페이스를 사용하면 됨
        //handle 메소드를 가지고 있는 인터페이스를 구현해놓은 그런 객체를 넣어주면 됨

        hs.createContext("/test", new MyHandler());

        //서버 시작
        hs.start();

        System.out.println("서버 시작됨...");

        //컴퓨터에서 어떤 요청이 오기를 기다리고 있음

        //<자바프로그램>
        //클라이언트의 요청을 받기
        //- 요청 라인(메소드, 경로, 프로토콜)
        //- 헤더(key:value 형태, 헤더를 보면 바디의 형태를 알 수 있음)
        //- 바디(상황에 따라 다름, 예를 들면 html, binary data, json 형태, 일반 텍스트)


        //HTTP 요청에 대한 응답하기
        //- 상태코드 작성
        //- 헤더
        //- 바디










    }
}

 

 

[2] : Handler interface

package main;

import com.sun.net.httpserver.*;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.logging.Handler;
import java.util.logging.LogRecord;

public class MyHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange exchange) throws IOException {
        System.out.println("MyHandler.handle called...");

        //요청받기(요청정보)
        String rm = exchange.getRequestMethod();
        System.out.println("rm = "+rm);         //GET

        URI requestURI = exchange.getRequestURI();
        System.out.println("requestURI = " + requestURI);   //test

        String protocol = exchange.getProtocol();
        System.out.println("protocol = " + protocol);       //HTTP/1.1

        HttpContext httpContext = exchange.getHttpContext();
        System.out.println("httpContext = " + httpContext);

        InetSocketAddress localAddress = exchange.getLocalAddress();
        System.out.println("localAddress = " + localAddress);

        HttpPrincipal principal = exchange.getPrincipal();
        System.out.println("principal = " + principal);

        InetSocketAddress remoteAddress = exchange.getRemoteAddress();
        System.out.println("remoteAddress = " + remoteAddress);

        int responseCode = exchange.getResponseCode();
        System.out.println("responseCode = " + responseCode);


        //요청받기(헤더)
        Headers requestHeaders = exchange.getRequestHeaders();
        for (String key : requestHeaders.keySet()) {
           String value = requestHeaders.getFirst(key);
            System.out.println(key + " : "+value);
        }
        

        //요청받기(바디)
        InputStream is = exchange.getRequestBody();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        StringBuilder sb = new StringBuilder();
        String data;
        while((data = br.readLine()) != null) {
            sb.append(data);
        }

        System.out.println("sb.toString() = " + sb.toString());



        //응답하기(상태코드, 헤더, 바디)
        String str = "<h1>hello~~~</h1>";


        //헤더 세팅
        Headers responseHeaders = exchange.getResponseHeaders();
        responseHeaders.set("Content-Type", "text/html");
        exchange.sendResponseHeaders(200, str.getBytes().length);

        //바디 세팅
        OutputStream os = exchange.getResponseBody();

        //OutputStream은 글자를 보낼 수 없다. 1바이트씩만 처리할 수 있기 때문이다

        os.write(str.getBytes());

        os.close();


        System.out.println("handle 끝남");
    }
}

'TIL(Today I Learned)' 카테고리의 다른 글

2023.06.09 복습  (0) 2023.06.10
2023.06.09 TIL  (0) 2023.06.09
2023.04.18 기록  (0) 2023.04.18
2023.04.06 기록  (0) 2023.04.06
2023.04.05 기록  (0) 2023.04.05