2023.05.02 TIL
2023. 5. 2. 19:54ㆍTIL(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 |