SlideShare a Scribd company logo
1 of 17
간단하게 서버를 이용해서,

웹 서비스 활용
                    김성익
            noerror@softnette.com
                        2011/7/13
웹 서비스 개요
• 간단하게 웹 서버 구현해서 어플리케이션
  연동
• 어플리케이션에서 웹 서비스 실행
 – 외부 웹 브라우저를 통해 통신
  메모리 사용량, 사용 리소스 리스트, 동접자 리스트, 서버 상태 등
  모니터 가능
장점
• 외부 모니터링 창구로 활용
 익스플로러, 크롬, 파이어폭스를 클라이언트로 사용

• 손쉬운 시각화
 html형태의 출력을 통해 다양한 시각화 처리

• 메시업 가능
 mashup : 외부 데이터 소스에서 가져온 콘텐트를 사용하여 새로운 서
 비스를 제공
 일부 기능을 구현해서 외부 페이지로 컨트롤 기능 처리

• 큰 부하 없이 처리 가능
웹 서비스 개요
• TCP 서비스
• 성격상 연결 기반의 통신은 아니기 때문에
  단순한 세션 관리 가능
• 간단한 텍스트 기반의 통신 체계
절차
• 서버를 연다
 기본포트번호 80

• 연결 후 데이터를 받는다.
 라인 피드가 연속(nn)된 부분까지 수신

• 패킷을 파싱해서 입력된 host, 경로, 세팅값
  들을 얻는다
 GET / HTTP/1.1
 Accept: text/html, application/xhtml+xml, */*
 Accept-Language: ko
 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; WOW64; Trident/5.0)
 Accept-Encoding: gzip, deflate
 Host: 127.0.0.1
 Connection: Keep-Alive
절차
• 해당 소켓으로 헤더에 구성한 후 결과와 함
  께 보낸다
 HTTP/1.1 200 OK
 Date: Sat, 19 May 2007 13:49:37 GMT
 Server: SimpleServer
 Pragma: no-cache
 Expires: Thu, 01 Jan 1970 00:00:00 GMT
 Content-Type: text/html;charset=ISO-8859-1
 Content-Language: en-US
 Content-Length: 67

 <header><title>simple server</title></header><body> Path = /</body>
서버 구성
• 간단한 tcp 서버로 구성
• MutiplexIO 사용
 – SimpleServer 프로젝트 참고
  //softnette/lab/simpleserver
 – IOCP 혹은 Select 사용
  동시 접근 유저수가 많지 않다면 select로도 충분
• 간단한 서비스 구성을 지향
 어플리케이션의 통신 수단으로의 역할
• Select 사용할 경우 메인 루프에 포함 가능
 동기화의 스트레스가 없음
Select 서버 예
• 서비스 시작
bool CSimpleServer::Start(unsigned short port, int threadcount)
{
    m_hSocket = socket(AF_INET, SOCK_STREAM, 0);

    if (m_hSocket == INVALID_SOCKET)
       return false;

    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port   = htons(port);
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

    if (bind(m_hSocket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
        return false;

    if (listen(m_hSocket, SOMAXCONN) == SOCKET_ERROR)
        return false;

    unsigned threadID = 0;
    if (threadcount > 0)
        m_hThread = (HANDLE)_beginthreadex(NULL, 0, _select, (void*)this, 0, &threadID);
    return true;
}
Select 서버 예
• 쓰레드에서 소켓 이벤트 검사
void CSimpleServer::Update(unsigned long timeouttick)
{
    unsigned int i;
    fd_set fd;
    timeval t;

    FD_ZERO(&fd);
    FD_SET(m_hSocket, &fd);

    for(i=0; i<m_SessionList.size(); i++)
        FD_SET(m_SessionList[i]->socket, &fd);

    t.tv_sec = timeouttick / 1000;
    t.tv_usec = (timeouttick % 1000) * 1000;

    if (::select(FD_SETSIZE, (fd_set*)&fd, (fd_set*)0, (fd_set*)0, timeouttick < 0 ? NULL : &t) != SOCKET_ERROR)
    {
        for(i=0; i<fd.fd_count; i++)
        {
            소켓 이벤트 처리
        }
    }
}
unsigned int CSimpleServer::SelectThread()
{
    while(m_bTerminate == false)
        Update(1000);

    return 0;
}
Select 서버 예
• 새롭게 연결되면 연결처리
for(i=0; i<fd.fd_count; i++)
{
    if (fd.fd_array[i] == m_hSocket)
    {
        SOCKADDR_IN addr;
        int addrlen;

           addrlen    = sizeof(addr);
           SOCKET client = accept(m_hSocket, (struct sockaddr*)&addr, &addrlen);

           if (CreateSession(client, addr.sin_addr.S_un.S_addr, addr.sin_port) == false)
               closesocket(client);
    }
    else
    {
           RECV처리
    }
}
Select 서버 예
• 끊겼으면 세션 닫고 아니면 읽기
for(i=0; i<fd.fd_count; i++)
{
    if (fd.fd_array[i] == m_hSocket)
         연결처리
    else
    {
         std::vector<_SESSION*>::const_iterator it;

        for(it=m_SessionList.begin(); it!=m_SessionList.end(); it++)
        {
            if ((*it)->socket == fd.fd_array[i])
            {
                _SESSION* s = (*it);
                unsigned long dwReadbytes;

                ioctlsocket(s->socket, FIONREAD, &dwReadbytes);

                if (dwReadbytes == 0)
                {
                     CloseSession(s);
                }
                else
                {
                     s->len += recv(s->socket, &s->buffer[s->len], dwReadbytes, 0);
                     UpdateSession(s);
                }
                break;
            }
        }
    }
프로토콜
•   http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
• 요청                                        GET / HTTP/1.1
                                            Accept: text/html, application/xhtml+xml, */
     – 단순요청                                 Accept-Language: ko

       GET 경로 rn
                                            User-Agent: Mozilla/5.0 (compatible; MSIE 9.
                                            Accept-Encoding: gzip, deflate
       GET /test rn                       Host: 127.0.0.1
                                            Connection: Keep-Alive
     – 전체요청
       Method 경로 프로토콜버전 rn
       GET /test HTTP/1.1rn
       Method = GET, SHOWMETHOD, PUT, POST, …
     – 요청 헤더 필드
       필드이름 : 데이터 rn
       Accept: text/plain, text/html
       필드 = From, Accept, Accept-Encoding, User-
       Agent, referer, Authorization, Connection, Pragma, Host, …
     – 연속 라인 피드 (헤더 끝)
프로토콜
• 응답                                     HTTP/1.1 200 OK
                                         Date: Sat, 19 May 2007 13:49:37 GMT

 – 상태
                                         Server: SimpleServer
                                         Pragma: no-cache
   프로토콜버전 상태 rn                        Expires: Thu, 01 Jan 1970 00:00:00 GMT
                                         Content-Type: text/html;charset=ISO-8859
   HTTP/1.1 200 OK rn                  Content-Language: en-US
                                         Content-Length: 67
 – 응답 헤더 필드
   필드이름 : 데이터 rn                <header><title>simple server</title></he

   Content-Type: text/html;charset=ISO-8859-1 rn
   필드 = From, Accept, Accept-Encoding, User-
   Agent, referer, Authorization, Connection, Pragma, Host,
   …
 – 데이터 크기
   Content-Length: 크기
 – 연속 라인 피드 (헤더 끝)
 – 데이터 (앞에서 언급한 크기, html 문법)
HTML
• 하이퍼텍스트 마크업 언어
• 기본 예
 <html>
   <head>
     <title>Hello HTML</title>
   </head>
   <body>
     <p>Hello World!</p>
   </body>
 </html>
간단한 서버
• 경로를 읽어서 웹 브라우저에 표시
int CWebServer::OnRecv(const void* buffer, int len)
{
    if (Find("rnrn", (char*)buffer, len) != -1)
    {
        std::string url = Get("GET", (char*)buffer, len);
        if (url.empty() == true)
            return 0;

       char path[512];
       sscanf_s(url.c_str(), "%s", path, sizeof(path));
       Parse(path);
       return len;
   }
   return 0;
}
void CWebServer::SendHTML(const char* src)
{
    const char* _fmt = "HTTP/1.1 200 OKn"
        "Date: Sat, 19 May 2007 13:49:37 GMTn"
        "Server: SimpleServern"
        "Pragma: no-cachen"
        "Expires: Thu, 01 Jan 1970 00:00:00 GMTn"
        "Content-Type: text/html;charset=ISO-8859-1n"
        "Content-Language: en-USn"
        "Content-Length: %dnn";
    char header[1024];
    sprintf_s(header, _fmt, strlen(src));
    Send(header, strlen(header));
    Send(src, strlen(src));
}
void CWebServer::Parse(const char* path)
{
    std::string html;
    html = std::string("<header><title>simple server</title></header><body> Path = ") + path + std::string("</body>");
    SendHTML(html.c_str());
}
매시업
• 간단한 http 규격의 API를 제공하는 것으로
  여러 가지 서비스가 가능
 스테이지 별 리소스 사용량을 분석하기 위해서 어플리케이션에 기능
 을 넣을 필요 없이 스테이지와 리소스를 얻을 수 있는 http 인터페이
 스를 만든다면, 외부 웹 서비스와 연동하여 스테이지 별 리소스, 게임
 의 릴리즈 버전 별 차이, 테스터 레벨 별 스테이지의 리소스 사용량 등
 의 정보를 손쉽게 만들 수 있음
질문 / 답

More Related Content

What's hot

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용흥배 최
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주iamhjoo (송형주)
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7JinWoo Lee
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5JinWoo Lee
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. JobHyosung Jeon
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Circulus
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기Myoung-gyu Gang
 
Blockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreBlockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreihpark92
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance상현 조
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractFermat Jade
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programmingihpark92
 

What's hot (20)

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
 
Blockchain 1st bitcoin_core
Blockchain 1st bitcoin_coreBlockchain 1st bitcoin_core
Blockchain 1st bitcoin_core
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
 
Blockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart ContractBlockchain Study(4) - Geth & Smart Contract
Blockchain Study(4) - Geth & Smart Contract
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
 

Viewers also liked

06_HDR 소개
06_HDR 소개06_HDR 소개
06_HDR 소개noerror
 
06_자동차물리입문(1)
06_자동차물리입문(1)06_자동차물리입문(1)
06_자동차물리입문(1)noerror
 
KGC06_적응성 있는 자원 흐름 관리
KGC06_적응성 있는 자원 흐름 관리KGC06_적응성 있는 자원 흐름 관리
KGC06_적응성 있는 자원 흐름 관리noerror
 
07_Visual Shader Editor
07_Visual Shader Editor07_Visual Shader Editor
07_Visual Shader Editornoerror
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개noerror
 
Engines, Tools, and Scripts
Engines, Tools, and ScriptsEngines, Tools, and Scripts
Engines, Tools, and ScriptsKalito Viscra
 
06_게임엔진 활용팁
06_게임엔진 활용팁06_게임엔진 활용팁
06_게임엔진 활용팁noerror
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성noerror
 
15_TextureAtlas
15_TextureAtlas15_TextureAtlas
15_TextureAtlasnoerror
 
NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집noerror
 

Viewers also liked (11)

06_HDR 소개
06_HDR 소개06_HDR 소개
06_HDR 소개
 
Ssao
SsaoSsao
Ssao
 
06_자동차물리입문(1)
06_자동차물리입문(1)06_자동차물리입문(1)
06_자동차물리입문(1)
 
KGC06_적응성 있는 자원 흐름 관리
KGC06_적응성 있는 자원 흐름 관리KGC06_적응성 있는 자원 흐름 관리
KGC06_적응성 있는 자원 흐름 관리
 
07_Visual Shader Editor
07_Visual Shader Editor07_Visual Shader Editor
07_Visual Shader Editor
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개
 
Engines, Tools, and Scripts
Engines, Tools, and ScriptsEngines, Tools, and Scripts
Engines, Tools, and Scripts
 
06_게임엔진 활용팁
06_게임엔진 활용팁06_게임엔진 활용팁
06_게임엔진 활용팁
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 
15_TextureAtlas
15_TextureAtlas15_TextureAtlas
15_TextureAtlas
 
NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집
 

Similar to 11_웹서비스활용

막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10hungrok
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210Yong Joon Moon
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
Http 헤더
Http 헤더Http 헤더
Http 헤더kidoki
 
Nginx Https 적용하기.pptx
Nginx Https 적용하기.pptxNginx Https 적용하기.pptx
Nginx Https 적용하기.pptxwonyong hwang
 
Hadoop security DeView 2014
Hadoop security DeView 2014Hadoop security DeView 2014
Hadoop security DeView 2014Gruter
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요dgmit2009
 
한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회
 
HTTP 발표자료 - 김연수
HTTP 발표자료 - 김연수HTTP 발표자료 - 김연수
HTTP 발표자료 - 김연수Yeon Soo Kim
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구ByungJoon Lee
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTPNAVER D2
 

Similar to 11_웹서비스활용 (20)

막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
Http 헤더
Http 헤더Http 헤더
Http 헤더
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
Nginx Https 적용하기.pptx
Nginx Https 적용하기.pptxNginx Https 적용하기.pptx
Nginx Https 적용하기.pptx
 
Redis
RedisRedis
Redis
 
Node.js 첫걸음
Node.js 첫걸음Node.js 첫걸음
Node.js 첫걸음
 
Hadoop security DeView 2014
Hadoop security DeView 2014Hadoop security DeView 2014
Hadoop security DeView 2014
 
Servlet3
Servlet3Servlet3
Servlet3
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
 
한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic
 
HTTP 발표자료 - 김연수
HTTP 발표자료 - 김연수HTTP 발표자료 - 김연수
HTTP 발표자료 - 김연수
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
 

More from noerror

KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법noerror
 
11_통계 자료분석 입문
11_통계 자료분석 입문11_통계 자료분석 입문
11_통계 자료분석 입문noerror
 
11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템noerror
 
11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법noerror
 
ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법noerror
 
08_Marching Cube Terrains
08_Marching Cube Terrains08_Marching Cube Terrains
08_Marching Cube Terrainsnoerror
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드noerror
 
08_플래시 맛보기
08_플래시 맛보기08_플래시 맛보기
08_플래시 맛보기noerror
 
08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강noerror
 
08_Wxwidgets 소개
08_Wxwidgets 소개08_Wxwidgets 소개
08_Wxwidgets 소개noerror
 
07_PhysX 강체물리 입문
07_PhysX 강체물리 입문07_PhysX 강체물리 입문
07_PhysX 강체물리 입문noerror
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개noerror
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현noerror
 
05_스마트 포인터 구현하기
05_스마트 포인터 구현하기05_스마트 포인터 구현하기
05_스마트 포인터 구현하기noerror
 
05_벡터와 매트릭스
05_벡터와 매트릭스05_벡터와 매트릭스
05_벡터와 매트릭스noerror
 
05_STL컨테이너정리
05_STL컨테이너정리05_STL컨테이너정리
05_STL컨테이너정리noerror
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요noerror
 
05_글로벌일루미네이션
05_글로벌일루미네이션05_글로벌일루미네이션
05_글로벌일루미네이션noerror
 
05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)noerror
 
04_장면 관리 개요
04_장면 관리 개요04_장면 관리 개요
04_장면 관리 개요noerror
 

More from noerror (20)

KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법
 
11_통계 자료분석 입문
11_통계 자료분석 입문11_통계 자료분석 입문
11_통계 자료분석 입문
 
11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템
 
11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법
 
ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법
 
08_Marching Cube Terrains
08_Marching Cube Terrains08_Marching Cube Terrains
08_Marching Cube Terrains
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드
 
08_플래시 맛보기
08_플래시 맛보기08_플래시 맛보기
08_플래시 맛보기
 
08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강
 
08_Wxwidgets 소개
08_Wxwidgets 소개08_Wxwidgets 소개
08_Wxwidgets 소개
 
07_PhysX 강체물리 입문
07_PhysX 강체물리 입문07_PhysX 강체물리 입문
07_PhysX 강체물리 입문
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현
 
05_스마트 포인터 구현하기
05_스마트 포인터 구현하기05_스마트 포인터 구현하기
05_스마트 포인터 구현하기
 
05_벡터와 매트릭스
05_벡터와 매트릭스05_벡터와 매트릭스
05_벡터와 매트릭스
 
05_STL컨테이너정리
05_STL컨테이너정리05_STL컨테이너정리
05_STL컨테이너정리
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요
 
05_글로벌일루미네이션
05_글로벌일루미네이션05_글로벌일루미네이션
05_글로벌일루미네이션
 
05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)05_컴파일러최적화전략(1)
05_컴파일러최적화전략(1)
 
04_장면 관리 개요
04_장면 관리 개요04_장면 관리 개요
04_장면 관리 개요
 

11_웹서비스활용

  • 1. 간단하게 서버를 이용해서, 웹 서비스 활용 김성익 noerror@softnette.com 2011/7/13
  • 2. 웹 서비스 개요 • 간단하게 웹 서버 구현해서 어플리케이션 연동 • 어플리케이션에서 웹 서비스 실행 – 외부 웹 브라우저를 통해 통신 메모리 사용량, 사용 리소스 리스트, 동접자 리스트, 서버 상태 등 모니터 가능
  • 3. 장점 • 외부 모니터링 창구로 활용 익스플로러, 크롬, 파이어폭스를 클라이언트로 사용 • 손쉬운 시각화 html형태의 출력을 통해 다양한 시각화 처리 • 메시업 가능 mashup : 외부 데이터 소스에서 가져온 콘텐트를 사용하여 새로운 서 비스를 제공 일부 기능을 구현해서 외부 페이지로 컨트롤 기능 처리 • 큰 부하 없이 처리 가능
  • 4. 웹 서비스 개요 • TCP 서비스 • 성격상 연결 기반의 통신은 아니기 때문에 단순한 세션 관리 가능 • 간단한 텍스트 기반의 통신 체계
  • 5. 절차 • 서버를 연다 기본포트번호 80 • 연결 후 데이터를 받는다. 라인 피드가 연속(nn)된 부분까지 수신 • 패킷을 파싱해서 입력된 host, 경로, 세팅값 들을 얻는다 GET / HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: ko User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; WOW64; Trident/5.0) Accept-Encoding: gzip, deflate Host: 127.0.0.1 Connection: Keep-Alive
  • 6. 절차 • 해당 소켓으로 헤더에 구성한 후 결과와 함 께 보낸다 HTTP/1.1 200 OK Date: Sat, 19 May 2007 13:49:37 GMT Server: SimpleServer Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Type: text/html;charset=ISO-8859-1 Content-Language: en-US Content-Length: 67 <header><title>simple server</title></header><body> Path = /</body>
  • 7. 서버 구성 • 간단한 tcp 서버로 구성 • MutiplexIO 사용 – SimpleServer 프로젝트 참고 //softnette/lab/simpleserver – IOCP 혹은 Select 사용 동시 접근 유저수가 많지 않다면 select로도 충분 • 간단한 서비스 구성을 지향 어플리케이션의 통신 수단으로의 역할 • Select 사용할 경우 메인 루프에 포함 가능 동기화의 스트레스가 없음
  • 8. Select 서버 예 • 서비스 시작 bool CSimpleServer::Start(unsigned short port, int threadcount) { m_hSocket = socket(AF_INET, SOCK_STREAM, 0); if (m_hSocket == INVALID_SOCKET) return false; SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if (bind(m_hSocket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) return false; if (listen(m_hSocket, SOMAXCONN) == SOCKET_ERROR) return false; unsigned threadID = 0; if (threadcount > 0) m_hThread = (HANDLE)_beginthreadex(NULL, 0, _select, (void*)this, 0, &threadID); return true; }
  • 9. Select 서버 예 • 쓰레드에서 소켓 이벤트 검사 void CSimpleServer::Update(unsigned long timeouttick) { unsigned int i; fd_set fd; timeval t; FD_ZERO(&fd); FD_SET(m_hSocket, &fd); for(i=0; i<m_SessionList.size(); i++) FD_SET(m_SessionList[i]->socket, &fd); t.tv_sec = timeouttick / 1000; t.tv_usec = (timeouttick % 1000) * 1000; if (::select(FD_SETSIZE, (fd_set*)&fd, (fd_set*)0, (fd_set*)0, timeouttick < 0 ? NULL : &t) != SOCKET_ERROR) { for(i=0; i<fd.fd_count; i++) { 소켓 이벤트 처리 } } } unsigned int CSimpleServer::SelectThread() { while(m_bTerminate == false) Update(1000); return 0; }
  • 10. Select 서버 예 • 새롭게 연결되면 연결처리 for(i=0; i<fd.fd_count; i++) { if (fd.fd_array[i] == m_hSocket) { SOCKADDR_IN addr; int addrlen; addrlen = sizeof(addr); SOCKET client = accept(m_hSocket, (struct sockaddr*)&addr, &addrlen); if (CreateSession(client, addr.sin_addr.S_un.S_addr, addr.sin_port) == false) closesocket(client); } else { RECV처리 } }
  • 11. Select 서버 예 • 끊겼으면 세션 닫고 아니면 읽기 for(i=0; i<fd.fd_count; i++) { if (fd.fd_array[i] == m_hSocket) 연결처리 else { std::vector<_SESSION*>::const_iterator it; for(it=m_SessionList.begin(); it!=m_SessionList.end(); it++) { if ((*it)->socket == fd.fd_array[i]) { _SESSION* s = (*it); unsigned long dwReadbytes; ioctlsocket(s->socket, FIONREAD, &dwReadbytes); if (dwReadbytes == 0) { CloseSession(s); } else { s->len += recv(s->socket, &s->buffer[s->len], dwReadbytes, 0); UpdateSession(s); } break; } } }
  • 12. 프로토콜 • http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol • 요청 GET / HTTP/1.1 Accept: text/html, application/xhtml+xml, */ – 단순요청 Accept-Language: ko GET 경로 rn User-Agent: Mozilla/5.0 (compatible; MSIE 9. Accept-Encoding: gzip, deflate GET /test rn Host: 127.0.0.1 Connection: Keep-Alive – 전체요청 Method 경로 프로토콜버전 rn GET /test HTTP/1.1rn Method = GET, SHOWMETHOD, PUT, POST, … – 요청 헤더 필드 필드이름 : 데이터 rn Accept: text/plain, text/html 필드 = From, Accept, Accept-Encoding, User- Agent, referer, Authorization, Connection, Pragma, Host, … – 연속 라인 피드 (헤더 끝)
  • 13. 프로토콜 • 응답 HTTP/1.1 200 OK Date: Sat, 19 May 2007 13:49:37 GMT – 상태 Server: SimpleServer Pragma: no-cache 프로토콜버전 상태 rn Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Type: text/html;charset=ISO-8859 HTTP/1.1 200 OK rn Content-Language: en-US Content-Length: 67 – 응답 헤더 필드 필드이름 : 데이터 rn <header><title>simple server</title></he Content-Type: text/html;charset=ISO-8859-1 rn 필드 = From, Accept, Accept-Encoding, User- Agent, referer, Authorization, Connection, Pragma, Host, … – 데이터 크기 Content-Length: 크기 – 연속 라인 피드 (헤더 끝) – 데이터 (앞에서 언급한 크기, html 문법)
  • 14. HTML • 하이퍼텍스트 마크업 언어 • 기본 예 <html> <head> <title>Hello HTML</title> </head> <body> <p>Hello World!</p> </body> </html>
  • 15. 간단한 서버 • 경로를 읽어서 웹 브라우저에 표시 int CWebServer::OnRecv(const void* buffer, int len) { if (Find("rnrn", (char*)buffer, len) != -1) { std::string url = Get("GET", (char*)buffer, len); if (url.empty() == true) return 0; char path[512]; sscanf_s(url.c_str(), "%s", path, sizeof(path)); Parse(path); return len; } return 0; } void CWebServer::SendHTML(const char* src) { const char* _fmt = "HTTP/1.1 200 OKn" "Date: Sat, 19 May 2007 13:49:37 GMTn" "Server: SimpleServern" "Pragma: no-cachen" "Expires: Thu, 01 Jan 1970 00:00:00 GMTn" "Content-Type: text/html;charset=ISO-8859-1n" "Content-Language: en-USn" "Content-Length: %dnn"; char header[1024]; sprintf_s(header, _fmt, strlen(src)); Send(header, strlen(header)); Send(src, strlen(src)); } void CWebServer::Parse(const char* path) { std::string html; html = std::string("<header><title>simple server</title></header><body> Path = ") + path + std::string("</body>"); SendHTML(html.c_str()); }
  • 16. 매시업 • 간단한 http 규격의 API를 제공하는 것으로 여러 가지 서비스가 가능 스테이지 별 리소스 사용량을 분석하기 위해서 어플리케이션에 기능 을 넣을 필요 없이 스테이지와 리소스를 얻을 수 있는 http 인터페이 스를 만든다면, 외부 웹 서비스와 연동하여 스테이지 별 리소스, 게임 의 릴리즈 버전 별 차이, 테스터 레벨 별 스테이지의 리소스 사용량 등 의 정보를 손쉽게 만들 수 있음