[cookbook] Steram #2

Stream #2 소개 (실전편)

이전 시간에서 stream #1을 설명했습니다. 2편으로 stream의 이론적인 부분을 작성할려 했으나, 그것보다는 먼저 Nodejs 에서 stream 을 이용한 여러가지 예제를 들어 stream에 대한 소스코드를 직접 접하면서 이해될 수 있도록 작성해봅니다. 이번에는 서버시간을 stream을 이용하여 브라우져에실시간`으로 보여주는 예제를 들어보겠습니다.

이번시간에 사용한 stream 간단이론

Stdin > Stdout 컨트롤하기

간단히 첫번째 실습시간으로 서버시간stream을 사용하여 컨트롤 해봅니다.

Stdout example source

$ cat time.js

#!/bin/env node

var old = Date();
while (true) {
  if (old == Date()) continue;

  console.log(Date());
  old = Date();
}

Stdin example source

$ cat pull.js 

#!/bin/env node

var port = parseInt(process.argv[2], 10) || 8081;

var io = require('socket.io').listen(port);

io.sockets.on('connection', function (socket) {
  // stdin start
  process.stdin.resume();

  // event data listen
  process.stdin.on('data', function(data) {
    // data emit
    socket.emit('gogogo', data.toString());
  });

  //
  // event pause
  //
  socket.on('pause', function() {
    process.stdin.pause();
  });

  //
  // event resume
  //
  socket.on('resume', function() {
    process.stdin.resume();
  });
});

Execute

$ ./time.js | ./pull.js 
info  - socket.io started

websocket writing 5:::{"name":"gogogo","args":["Thu Jul 19 2012 22:45:27 GMT+0900 (KST)"]}
…
…
…

자 이제 1초씩 반복되는 데이타가 실시간으로 웹브라우져에 보여줄 준비가 되었습니다.

Client Websocket Source

<style>
  .foo {
    border: 5px solid red;
    width: 500px;
    height: 500px;
    overflow: auto;
  }
</style>
<div id="foo" class="foo"></div>

<script src="http://nodeqa.com:8081/socket.io/socket.io.js"></script>
<script>
  var obj = document.getElementById('foo');
  var socket = io.connect('http://nodeqa.com:8081');

  //
  // server 로부터 발생되는 이벤트
  //
  socket.on('gogogo', function (data) {
    var dummy = document.createElement('div');
    dummy.innerHTML = data;
    obj.appendChild(dummy);

    obj.scrollTop = obj.scrollHeight;
  });
</script>

<!-- stream 을 마음대로 정지합니다. -->
<input type="button" id="pause" value="Pause" onclick="socket.emit('pause')">

<!-- stream 을 마음대로 재시작합니다. -->
<input type="button" id="resume" value="Resume" onclick="socket.emit('resume')">

ScreenShot

a

결론

자 아주 빠르게 process.stdin과 process.stdout으로 nodejs 에서 stream을 대충 구현하여, 눈으로 확인하였습니다. stdin 으로 여러종류의 데이타를 흘려보내고, 이를 Nodejs에서 여러가지 방법으로 data를 조작할 수 있습니다. 아이디어는 여러분의 것입니다. :)

추천 관련글