본문 바로가기

# 미사용

웹서버 시작하기

웹서버 시작/종료

노드에 기본적으로 들어있는 http 내장모듈을 사용하면

웹 서버 기능을 담당하는 서버 객체를 만들 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let http  = require('http');
 
//! 웹 서버 객체를 생성하고, 3000번 포트에서 대기한다.
let server  = http.createServer();
let port    = 3000;
server.listen(port, ()=>
{
    //! 웹 서버가 실행되었을 때의 콜백.
    console.log('웹 서버가 다음 포트에서 시작됨 : %d', port);
    server.close(()=>
    {
        //! 웹 서버가 종료되었을 때의 콜백.
        console.log("웹 서버가 종료됨");
    })
});
 
cs

출력

> 웹 서버가 다음 포트에서 시작됨 : 3000

> 웹 서버가 종료됨


웹서버 이벤트 처리

클라이언트가 웹 서버에 접속했을 때,

발생할 수 있는 주요 이벤트의 이름은 다음과 같다.

 이벤트 이름

 설명 

  connection

 클라이언트가 웹 서버에 접속했을 때 발생하는 이벤트.

  request

 클라이언트가 요청할 때 발생하는 이벤트.

  close

 서버가 종료할 때 발생하는 이벤트.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
let http  = require('http');
 
//! 웹 서버 객체를 생성하고, 3000번 포트에서 대기한다.
let server  = http.createServer();
let port    = 3000;
 
//! 웹 서버 시작.
server.listen(port, ()=>
{
    //! 웹 서버가 실행되었을 때의 콜백.
    console.log('웹 서버가 다음 포트에서 시작됨 : %d', port);
});
 
//! 클라이언트 연결 이벤트.
server.on('connection', (socket)=>
{
    let addr = socket.address();
    console.log('클라이언트 접속 : %s, %d', addr.address, addr.port);
});
 
//! 클라이언트 요청 이벤트.
server.on('request', (req, res)=>
{
   console.log('클라이언트 요청 : %s', req);
});
 
//! 서버 종료 이벤트.
server.on('close', ()=>
{
    console.log('웹 서버가 종료됨.');
});
 
cs

출력

> 웹 서버가 다음 포트에서 시작됨 : 3000

> 클라이언트 접속 : ::1, 3000

> 클라이언트 요청 : [object Object]

> 웹 서버가 종료됨


클라이언트의 요청에 응답하기

클라이언트의 요청에 응답하려면 'request' 이벤트를 처리할 때,

res 객체에 페이지/파일/데이터를 output 해야한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let http  = require('http');
 
//! 웹 서버 객체를 생성하고, 3000번 포트에서 대기한다.
let server  = http.createServer();
let port    = 3000;
 
//! 웹 서버 시작.
server.listen(port, ()=>
{
    //! 웹 서버가 실행되었을 때의 콜백.
    console.log('웹 서버가 다음 포트에서 시작됨 : %d', port);
});
 
//! 클라이언트 요청 이벤트.
server.on('request', (req, res)=>
{
   console.log('클라이언트 요청 : %s', req);
   res.writeHead(200, {"Content-Type""text/plain; charset=utf-8"});
   res.write("Hello World!");
   res.end();
});
 
cs

콘솔 출력

> 웹 서버가 다음 포트에서 시작됨 : 3000

> 클라이언트 요청 : [object Object]


클라이언트 웹 페이지 출력

> Hello World!


응답헤더 설정하기

클라이언트에게 보낼 응답의 종류에 따라

Conteyte-Type을 다르게 설정해야 한다.


 Content-Type

 설명 

 text/plain

 일반 텍스트 문서

 text/html

 HTML 문서 

 text/xml

 XML 문서 

 image/jpeg

 HPEG 파일

 image/png 

 PNG 파일 

 video/mpeg MPEG 비디오 파일 

 audio/mp3

 MP3 음악 파일 

 application/zip

 ZIP 압축 파일 


스트림으로 응답하기

res 객체는 writeStream을 상속받았기 때문에,

readStream과 pipe로 연결하면 파일을 쉽게 전송할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let fs    = require('fs');
let http  = require('http');
 
//! 웹 서버 객체를 생성하고, 3000번 포트에서 대기한다.
let server  = http.createServer();
let port    = 3000;
 
//! 웹 서버 시작.
server.listen(port, ()=>
{
    //! 웹 서버가 실행되었을 때의 콜백.
    console.log('웹 서버가 다음 포트에서 시작됨 : %d', port);
});
 
//! 클라이언트 요청 이벤트.
server.on('request', (req, res)=>
{
   console.log('클라이언트 요청 : %s', req);
   res.writeHead(200, {"Content-Type""text/plain; charset=utf-8"});
   fs  .createReadStream("./HelloWorld.txt", {flags: 'r'})
       .pipe(res);
   //! res.end();
});
 
cs

콘솔 출력

> 웹 서버가 다음 포트에서 시작됨 : 3000

> 클라이언트 요청 : [object Object]


클라이언트 웹 페이지 출력

> Hello World!


위의 코드에서 22번째 줄을 주석처리한 것에 주목하자.


노드에서 파일 입출력은 비동기로 이루어지기 때문에,

파일을 읽는 도중에 22번째 줄이 먼저 실행되므로,

명시적으로 end()를 작성한다면 응답이 전송되지 않을 수 있다.


다른 웹서버를 파싱하여 응답하기 (HTTP(S)-GET)

다른 웹서버의 데이터로 응답해야 한다면,

http, https 내장모듈을 사용하여 다른 웹서버에 데이터를 요청할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
let http    = require('http');
let google  = {
    host: 'www.google.co.kr',
    port: 80,
    path: '/'
} ;
 
//! HTTP GET 방식.
let req = http.get(google, (res)=>
{
    //! 응답 처리
    let resData = '';
    res.on('data', (dataBlock)=>
    {
        resData += dataBlock;
    });
    res.on('end', ()=>
    {
        console.log(resData);
    });
});
 
//! 에러처리.
req.on('error', (err)=>
{
    console.log("에러 발생 : %s", err.message);
});
 
cs

출력

> 생략


다른 웹서버를 파싱하여 응답하기 (HTTP(S)-POST)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
let http    = require('http');
let google  = {
    host: 'www.google.co.kr',
    port: 80,
    path: '/',
 
    method  : 'post',
    headers : {}
};
 
//! HTTP POST 방식.
let req = http.request(google, (res)=>
{
    //! 응답 처리
    let resData = '';
    res.on('data', (dataBlock)=>
    {
        resData += dataBlock;
    });
    res.on('end', ()=>
    {
        console.log(resData);
    });
});
 
//! 에러처리.
req.on('error', (err)=>
{
    console.log("에러 발생 : %s", err.message);
});
 
//! 헤더작성.
google.headers['Content-Type']  = 'application/x-www-form-urlencoded';
req.data = 'q=actor';
google.headers['Content-Length']= req.data.length;
 
//! 요청전송.
req.write(req.data);
req.end();
 
cs

출력

> 생략


'# 미사용' 카테고리의 다른 글

쿠키 세션 다루기  (0) 2018.02.25
라우터 다루기  (0) 2018.02.25
익스프레스 알아보기  (0) 2018.02.23
Chrome Headless Driver  (0) 2018.02.12
파일 입출력 다루기  (0) 2018.02.10