웹서버 시작/종료 |
노드에 기본적으로 들어있는 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 |