Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Guest Book

  1. 블로그 잘 보고 있습니다. 헌데 글들을 보는게 힘드네요.
    아카이브나 폴더 형식으로 어떻게 안될까요?
    글이 너무 많아서 페이지별로 넘기기 너무 힘드네요..
    글 제목만 보고 제가 원하는 글만 읽고 싶어서요..
    크롤러를 만들어서 돌려야 될까요...

    1. 아카이브에서 볼때 글이 함께 출력되서 불편해서 그러시죠? 무슨 말인지 이해했습니다. 리스트만 출력하는 방식을 고민해 봐야겠네요.

    2. 오!!
      쉽게 변했네요. 감사합니다.
      제목만 나와서 좀 더 쉽게 읽어볼 수 있겠어요.
      이제 정주행 들어갑니다ㅎㅎㅎ

    3. 오. 다시 오셨군요. 목록과 글을 같이 보는건 저도 불편했는데 직접 탐색을 많이 하지 않다보니 깊게 생각은 못하고 있었습니다. 덕분에 이번에 개편하면서 수정했습니다. ㅎ

  2. 안녕하세요.

    foot writer를 구입하고 싶어서 이렇게 연락처를 남깁니다.

    연락처 : naver@snu.ac.kr

    번호 : 010-구칠구칠-0305


    혹시 이전에 판매하시던 FW-100K 모델은 더 이상 판매 안하시는지 궁금합니다.



    고맙습니다.

    1. 저는 판매자가 아닙니다.

  3. ㅅㅅㅅㅅㅅ

  4. 관리자만 볼 수 있는 방명록입니다.

    1. 딱 말씀하신 구현 자체는 난이도가 높아보이지 않습니다.

      웹아시트에서 사이트를 보이면 서버에 접속을 해놓고 기다리고 있고 모바일에서 해당 URL에 접속해서 같은 PIN 값을 주면 데스크탑과 연결해서 서로에서 연결되었다는 응답을 주는 것이니 웹소켓 서버를 설정해서 연결을 주고 받게 하고 뒤에서 PIN 넘버 처리나 타임아웃이나 예외처리등을 비즈니스로직에서 해주면 됩니다.(상황이 추상적이라 설명도 자세히 드리긴 어렵네요.) 웹소켓 자체가 그런 용도로 많이 사용하니 두 클라이언트를 연결하는 건 채팅 등의 예제를 찾으면 많이 보실 수 있습니다.

      이건 웹소켓을 쓰지 않아도 그냥 ajax 폴링을 이용해서도 가능은 합니다.(딜레이는 약간 있을 수 있습니다.) 그리고 웹소켓을 쓰더라도 웹소켓을 지원하지 않는 브라우저가 있으니 어차피 ajax 폴링까지 구현해야 서비스 할 수 있을 것으로 보입니다.

      개발기간 같은 것은 개발자의 상황이나 다른 비즈니스 로직등도 많을 테니 제가 얼마나 걸린다고 말씀드리긴 어려울 것 같네요.

  5. 답변 감사합니다.^^

    앞으로 종종 찾아 뵙겠습니다. 좋은 하루 되세요.

  6. 질문 드릴게 있어서 방명록에 남김니다.

    var http = require('http')
    , fs = require('fs')
    , path = require('path')
    , io = require('socket.io');

    var server = http.createServer(function(req, res) {
    var filename = path.join(process.cwd(), req.url);

    fs.exists(filename, function(exists) {
    if(!exists) {
    res.writeHead(404, {"Content-type": "text/plain"});
    res.write("404 Not Found\n");
    res.end();
    return;
    }
    fs.readFile('./index.html'
    , encoding='utf-8'
    , function(err, data) {
    if(err) {
    res.writeHead(500, {"Content-Type": "text/plain"});
    res.write(err + "\n");
    res.end();
    return;
    }
    res.writeHead(200, {
    "Content-Type": "text/html; charset=utf-8"
    });
    res.end(data);
    });
    });
    });

    server.listen(3000);

    io = io.listen(server);

    //io.configure(function() {
    // io.enable('browser client etag');
    // io.set('log level', 3);
    // io.set('transports', [
    // 'websocket'
    // , 'flashsocket'
    // , 'htmlfile'
    // , 'xhr-polling'
    // , 'jsonp-polling'
    // ]);
    //});

    // socket.IO 로직을 작성할 부분
    io.sockets.on('connection', function(socket) {
    console.log('connected');
    socket.on('disconnect', function() {
    console.log('Good-bye');
    });

    socket.on('message', function(msg) {
    console.log(msg);
    socket.send('서버 쪽 메시지 테스트');
    });

    socket.send('send로 보내는 메시지', function() {
    console.log('메시지가 전달되었습니다.');
    });

    socket.on('from client', function(data) {
    console.log(data.text);
    socket.emit('from server'
    , {text:'서버에서 보낸 emit'}
    , function(res) {
    console.log('from server 이벤트:' + res);
    });
    });
    });

    var another = io.of('/another').on('connection'
    , function(socket) {
    socket.send('another 네임스페이스로 보낸 send 메시지');

    socket.on('nickname', function(nickname) {
    socket.set('nickname', nickname, function() {
    console.log('닉네임이 저장됐습니다.');
    });
    socket.get('nickname', function(err, nickname) {
    socket.emit('nickname', '닉네임: ' + nickname);
    });
    });

    socket.on('joinroom', function(msg) {
    console.log(msg);
    socket.join('some room');
    });

    socket.on('leaveroom', function(msg) {
    console.log(msg);
    socket.leave('some room');
    });

    var timer = setInterval(function() {
    var time = new Date();
    socket.broadcast.to('some room').emit('in room', time);
    }, 2000);
    });

    console.log("서버가 시작됐습니다. http://localhost:3000");

    node.js프로그래밍책 7장의 server.js 내용 전체인데요.

    일단 path.exists는 찾아보니 fs.exists하면 오류없이 넘어가서 fs.exists로 바꾸고,

    io.configure부분도 path.exists처럼 "undefined is not a function" 에러가 나서

    io.configure부분을 전체 주석처리 했습니다.

    질문 1. io.configure에서 "undefined is not a function" 에러가 발생하는 이유가 궁금합니다.

    (configure가 존재하지 않아서 undefined인거 같은데 어떻게 바꾸어야할지 모르겠습니다.)

    질문 2. io.sockets.on('connection', function(socket) { 이 부분으로 클라이언트와 1:1로 연결해서

    socket.send('send로 보내는 메시지', function() {

    console.log('메시지가 전달되었습니다.');

    }); 이부분을 통해 메시지를 보내고 콜백함수에 console.log로 확인하는거 같은데

    node server 실행후 화면에서 메시지가 전달되었습니다. 라는 콘솔이 나오지 않습니다.

    웹에서 <div>태그 안에 'send로 보내는 메시지'는 출력되는데 말이죠.

    혹시 제가 실수한 부분이 있는지 잘 모르겠습니다.

    질문 3. var another = io.of('/another').on('connection', function(socket) {

    부분이 전부 인식이 되지 않는것 같습니다.

    console.log('another-connected');를 추가해 보았는데 콘솔에 출력이 안되는것을 확인했습니다.

    웹페이지와 콘솔에 another에서 보내는 부분은 전부 출력이 안되구요.

    ※ 주변에 node.js를 피드백 받을 사람이 없어서 인터넷 검색을 해보는데 영어로는 원하는 결과를 찾는게

    어려워서 책에 있는 저자님 블로그에 직접 방문하게 되었습니다. 도움 주시면 감사하겠습니다.

    1. 추가로 질문 드릴게 있어서 덧글에 남깁니다.
      npm install express랑 -g 둘다 햇는데 cmd 창에서 express simple-chat하면 실행할 수 없다고 합니다.

      이럴 경우 어떻게 해야 되나요 ?

    2. 안녕하세요. 그동안 노드쪽 버전이 달라진 부분이 많아서 고생이 많으시네요

      질문 1. io.configure에서 "undefined is not a function" 에러가 발생하는 이유가 궁금합니다.

      위 오류를 보니 socket.io 0.9.x가 아니라 1.x를 쓰시는 듯 합니다. 책의 예제는 0.9.x 기반으로 되어 있지만 1.x에서는 API가 달라져서 `configure` 함수가 없어졌고 다음과 같이 socket.io에 HTTP 서버 객체를 전달할 때 옵션객체로 전달하게 됩니다. ( http://socket.io/docs/migrating-from-0-9/#configuration-differences 를 참고하세요. )

      var io = require('socket.io')(server, {
      transports: ['polling', 'websocket'],
      allowUpgrades: true
      });

      질문 2

      전달 확인 콜백을 사용하려면 클라이언트 쪽에서 콜백을 받아서 실행해 주어야 합니다. send는 클라이언트가 `message` 이벤트로 받으므로 다음과 같이 callback을 받아서 실행해야 합니다.

      socket.on('message', function(msg, callback) {
      printMessage(msg);
      callback('success');
      });

      질문 3에 대해서는 저는 주신 코드로 했을 때 another쪽이 전부 실행되는데 클라이언트에 var another = io.connect('http://localhost:3000/another'); 같은 연결 코드가 있는지 확인 부탁드립니다.

      그리고 보고 계신지 모르겠지만 https://github.com/outsideris/node.js-programming/tree/features/node-0.10 를 보시면 노드 0.10 버전에 맞게 갱신된 부분이 있으므로 따라하시는데 좀더 도움이 될 겁니다.(socket.io는 1.0 버전은 아닙니다.)

    3. express 관련해서는 현재 버전의 express는 글로벌로 설치해서(-g) 프로젝트 초기화하는 기능이 사라졌습니다. 이 기능은 express-generator ( https://github.com/expressjs/generator/ )로 분리가 되었으므로 npm install -g express-generator로 설치하면 동일하게 사용할 수 있습니다.