스트림(Stream)
스트림 : 데이터의 전송 흐름
- 콘솔 입력/출력
- 파일 읽기/쓰기
- 서버/클라이언트 - 데이터 전송
스트림 모듈
- 스트림을 다루기 위한 추상 인터페이스
- 다양한 스트림을 같은 인터페이스로 다룰 수 있다.
스트림 종류
- 읽기 스트림 :
Readable Stream
- 쓰기 스트림 :
Writable Stream
- 읽기 / 쓰기 :
Duplex
- 변환 :
Transform
Readable Stream
- 모드 :
flowing, paused
flowing mode
: 데이터를 자동으로 읽는 모드, 전달되는 데이터를 다루지 않으면 데이터 유실paused mode
: 데이터가 도착하면 대기, read()함수로 데이터 읽기readable.read(size)
: 읽기readable.pause()
: 중지readable.resume()
: 재개readable.pipe(destination, option)
: 파이프readable.unpipe(destination)
: 파이프 제거
Readable Event
readable
: 읽기 가능한 상태data
: 읽을 수 있는 데이터 도착end
: 더 이상 읽을 데이터가 없는 상태close
: 스트림이 닫힌 상태error
: 에러
flowing Mode
- data 이벤트 구현
- pipe 연결
- resume() 호출
var is = fs.createReadStream(file);
is.on('readable',function(){
console.log('==READABLE EVENT');
});
is.on('data',function (chunk) {
console.log('==DATA EVENT');
console.log(chunk.toString());
});
Writable Stream
- 데이터 출력
- http 클라이언트의 요청
- http서버의 응답
- 파일 쓰기 스트림
- tcp 소켓
데이터 쓰기, 인코딩
Writable.setDefaultEncoding(encoding)
Writable.write(chunk,encoding,callback)
스트림 닫기
Writable.end(chunk,encoding,callback)
버퍼
Writable.cork()
Writable.uncork()
Writable Event
drain
: 출력 스트림에 남은 데이터를 모두 보낸 이벤트error
: 에러finish
: 모든 데이터를 쓴 이벤트pipe
: 읽기 스트림과 연결(pipe)된 이벤트unpipe
: 읽기(pipe) 해제 이벤트
var os = fs.createWriteStream(file);
os.on('finish',function(){
console.log('==finish EVENT');
});
os.write('1234');
os.write('5678');
os.end('9'); //Finish Event
표준 입출력 스트림
process.stdin
: 콘솔 입력process.stdout
: 콘솔 출력
스트림 연결
var is = process.stdin;
var os = fs.createWriteStream('output.txt');
os.on('pipe',function(src){
console.log('pipe event');
})
// exit 입력이 오면 파이프 연결 해제
is.on('data',function(data){
if(data.trim() == 'exit'){
is.unpipe(os);
}
});
is.pipe(os);
URL 다루기
- URL : Uniform Resource Locator
- Protocol :
http, https
- Host :
www.google.com
- Port :
/80
- Path :
/test.txt
- Query :
?q=testQuery
- Fragment
URL 모듈
var url = require('url')
url.parse(urlStr,parseQueryString,slashesDenoteHost)
urlStr
: URL 문자열parseQueryString
: 쿼리 문자열 파싱, 기본값 falseslashesDenoteHost
: // 시작하는 주소의 경우, 호스트 인식 여부, 기본값 false
쿼리 문자열(query String)
- 이름=값&이름=값 형태로 정보 전달
url.parse(urlStr,true)
URL 만들기, 변환
url.format(urlObj)
url.resolve(from,to)
URL에 허용되는 문자
- 한글은 인코딩을 해주어야한다.
- 모듈 :
urlencode
쿼리 스트링
쿼리스트링 모듈
var queryString = require('querystring')
쿼리 문자열 분석하기
querystring.parse(str,sep,eq,option)
sep,eq
: 구분자
쿼리 스트링의 배열
group=걸스데이&member=유라&member=혜리
- 같은 값을 준다.
클러스터(Cluster)
- 여러 시스템을 하나로 묶어서 사용하는 기술
- 멀티 프로세스, 멀티 코어
Nodejs 클러스터
- 1개의 싱글 쓰레드
- 멀티 코어 시스템의 장점을 살리기 - 클러스터
- 클러스터 사용시 포트 공유 - 서버 작성 편리
-
코어(프로세서)의 개수 만큼 사용
- 클러스터링 : 마스터와 워커 프로세스
- 마스터 : 메인프로세스, 워커 생성
- 워커 : 보조프로세스, 마스터가 생성
클러스터(Cluster) 모듈
var cluster = require('cluster')
클러스터(Cluster) 생성(마스터)
cluster.fork()
구분하기
cluster.isMaster
cluster.isWorker
if(cluster.isMaster){
// Master Code
cluster.fork();
}else{
// Worker Code
}
클러스터(Cluster) 이벤트(Event)
fork
: Worker 생성 이벤트online
: Worker 생성 후 동작하는 이벤트listening
: Worker에 작성한 서버의 listen 이벤트disconnect
: Worker 연결 종료-
exit
: Worker Process 종료 message
: 메시지 이벤트disconnect
: Worker 연결 종료
Worker 접근
cluster.worker
worker.id
Worker 종료
worker.kill
마스터가 워커에게 데이터 전달
worker.send(data)
worker.on('message',function(data){});
워커가 마스터에게 데이터 전달
process.send(data)
var worker = cluster.fork(); worker.on('message',function(data){})
마스터와 워커 분리
cluster.setupMaster(setting)
cluster.setupMaster({exec:'worker.js'})