Java Nio Selector를 활용한 Http 서버

kwak woojong·2024년 2월 5일
0

나만의 간단한 HTTP 서버 만들기: CrazyHttpServer

최근에 나만의 간단한 HTTP 서버를 만들어보았습니다. 이 프로젝트의 이름은 "CrazyHttpServer"입니다. CrazyHttpServer는 Java로 작성되었으며, 간단한 웹 서버의 기능을 수행합니다. 여기에는 HTTP 프로토콜을 처리하는 데 필요한 핵심적인 기능이 구현되어 있습니다.

CrazyHttpServer 소개

CrazyHttpServer는 Java의 NIO(Non-blocking I/O)를 활용하여 구현되었습니다. NIO를 사용함으로써 블로킹되지 않는 다중 클라이언트 연결을 처리할 수 있습니다. 이 서버는 간단한 로고를 출력하고 HTTP 요청을 받아들이며, 적절한 핸들러를 통해 요청을 처리합니다.

CrazyHttpServer 진입점

// CrazyHttpServer.java

public class CrazyHttpServer {

    public static void main(String[] args) {
        HttpServer httpServer = new HttpServer();
        httpServer.start();
        printLog();
    }

    private static void printLog() {
        System.out.println(logo);
    }
}

CrazyHttpServer의 진입점 클래스는 CrazyHttpServer입니다. 이 클래스에서는 HttpServer를 생성하고 시작한 후 간단한 로고를 출력합니다.

HttpServer: 핵심 클래스

CrazyHttpServer의 핵심 기능을 담당하는 클래스는 HttpServer입니다. 이 클래스는 Selector를 사용하여 다중 클라이언트 연결을 관리하며, 각 클라이언트 요청에 대한 핸들러를 호출합니다.

HttpServer 클래스

// HttpServer.java

public class HttpServer extends Thread {

    // 중략...

    @Override
    public void run() {
        while (true) {
            try {
                int select = selector.select(100);

                if (select < 0) {
                    System.out.println("no select. continue");
                    continue;
                }
                Set<SelectionKey> selectionKeys = selector.selectedKeys();
                for (SelectionKey selectionKey : selectionKeys) {
                    dispatch(selectionKey);
                    addTimeoutMap(selectionKey);
                }
                selectionKeys.clear();

            } catch (IOException e) {
                e.printStackTrace();
                HttpUtils.closeSocket((SocketChannel) key.channel());
            } catch (CancelledKeyException e) {
                e.printStackTrace();
            }
        }
    }

    // 중략...
}

HttpServer 클래스는 Thread를 상속하여 멀티스레딩으로 동작하며, Selector를 사용하여 비동기적으로 다중 클라이언트 요청을 처리합니다.

핸들러와 다른 클래스들
서버의 핵심인 HttpServer 외에도 핸들러, 소켓 핸들러, 모니터링 스레드, 설정 클래스 등 다양한 클래스들이 CrazyHttpServer에 구현되어 있습니다. 이들 클래스는 서버의 동작을 지원하고 다양한 기능을 담당합니다.

마무리
CrazyHttpServer 프로젝트를 통해 간단한 HTTP 서버를 어떻게 구현할 수 있는지 살펴보았습니다. 이 서버는 학습 및 개인 프로젝트 용도로 적합하며, 좀 더 복잡하고 안전한 서버를 구축하려면 추가적인 기능과 보안 강화가 필요할 것입니다.

이 프로젝트는 계속해서 발전시켜 나가고, 필요한 기능을 추가하며 개선해 나갈 계획입니다. 더 많은 기능과 안정성을 갖춘 서버를 만들기 위해 노력할 것이며, 다양한 기술을 접목하여 CrazyHttpServer를 더욱 강력하게 만들어 나가겠습니다.

Happy coding! 🚀


상기 글은 내 프로젝트 클래스들을 일일히 챗GPT에 붙여 넣고

마지막에 블로그 글로 정리해달라고 한 글이다.

나름 꽤 괜찮게 쓴 것 같은데

https://github.com/Crazykwak/CrzayHttpServer

깃헙 링크는 상기와 같다. 수정점이 아직 많은데, 뭐 시간 남으면 천천히 리팩토링하고 보안점 추가하면 되겠다.


참고로 챗 지피티에게 물어본 보완점은 ㅋㅋㅋ

profile
https://crazyleader.notion.site/Crazykwak-36c7ffc9d32e4e83b325da26ed8d1728?pvs=4<-- 포트폴리오

0개의 댓글

관련 채용 정보