node.js 개발 (2)

2013년 8월 18일 일요일

간단한 echo 서버/클라이언트

server.js

/**
 * server.js
 * echo server
 *
 * @require net
 */

var net = require('net')
var os = require('os')

var server = net.createServer()
var sockets = []

console.log(os.platform())
console.log(os.arch())
console.log(os.totalmem())
console.log(os.freemem())
console.log(os.cpus())
console.log(os.networkInterfaces())

server.on('connection', function (socket) {
  console.log('Connect')

  socket.setEncoding('utf8')

  socket.write("나가려면 '/q'n")
  sockets.push(socket)

  console.log('Client Count:', sockets.length)

  socket.on('data', function (data) {
    console.log('수신데이터:', data.toString())
    if (data.trim().toLowerCase() == '/q') {
      socket.write('bye')
      return socket.end()
    }

    sockets.forEach(function (otherSocket) {
      if (otherSocket != socket) {
        otherSocket.write(data)
      }
    })
  })

  socket.on('error', function (err) {
    console.log('socket err:', err.message)
  })

  socket.on('close', function () {
    console.log('Socket Close')
    var index = sockets.indexOf(socket)
    sockets.splice(index, 1)
  })
})

server.on('error', function (err) {
  console.log('servererr:', err.message)
})

server.on('close', function (err) {
  console.log('Server Close')
})

server.listen(4001)

client.js

/**
 * client.js
 * 테스트client
 *
 * @require net
 */

// module
var net = require('net')

// vars
var port = 4001
var conn = null

var retryInterval = 3000
var retriedTimes = 0
var maxRetries = 10

process.stdin.resume()
;(function connect() {
  function reconnect() {
    if (retriedTimes >= maxRetries) {
      throw new Error('최대 재시도 횟수 최과. 재접속 포기')
    }
    retriedTimes++
    setTimeout(connect, retryInterval)
  }

  conn = net.createConnection(port)

  conn.on('connect', function () {
    console.log('새 커넥션')
    retriedTimes = 0
  })

  conn.on('data', function (data) {
    console.log('->', data.toString())
  })

  conn.on('error', function (err) {
    console.log('err:' + err.message)
  })

  conn.on('close', function () {
    console.log('컨넥션 닫힘')
  })

  process.stdin.pipe(conn, { end: false })
})()

기타 설명

require()

CommonJS에서 명세된 모듈을 불러들이는 함수. 각각의 모듈은 require로 호출하여 사용한다. 각각의 모듈의 scope는 분리되어있다. 모듈간의 데이터는 전역객체인 exports를 이용하여 전달한다. => require의 return값은 해당 모듈의 exports가 된다.

Array.prototype.forEach()

ECMAScript 5에 추가된 내용으로 Javascript기준으로 1.6에 추가되었다.