node.js

채팅소스#1 - app.js

컨텐츠 정보

본문

const express = require('express');
const http = require('http');
//var requestIp = require('request-ip');

// http 모듈은 서버생성 메소드(createServer)를 제공하며,
// 파라메터에 express를 넘겨 줍니다.
// 이것을 통해 express로 서버를 생성합니다.
// server 변수에 담는 이유는 createServer는 서버생성 후 서버객체를 리턴해주기 때문이며
// 이를 통해 생성된 서버를 제어하기 위해서이다.
const app = express();
const server = http.createServer(app);

const fs = require('fs');
const io = require('socket.io')(server);

// express 객체가 하위 폴더인 src 폴더와 그 하위폴더에 접근할 수 있도록 권한지정
// 따라서, 보안에 민감한 폴더가 하위에 있을 경우 따로따로 지정해야 함
app.use(express.static('src'));

// GET과 POST방식중 GET 방식을 이용하여 사용자가 사이트에 접근토록 합니다.
// express의 GET 방식으로 제어를 시작합니다.
// '/'는 사용자가 접근할 URL경로 입니다.(GET방식이므로 사용자가 입력한 URL값으로 제어를 함)
// 성공적으로 접속이 됐을 경우 function을 실행합니다.
// request 인자값은 클라이언트가 요청한 요청 오브젝트 값이 전달되어 오고
// response 인자값은 서버에서 클라이언트로 전송할 응답 오브젝트 값이 전달되어 옵니다.
app.get('/', (req, reponse) => {

    // 내장모듈인 fs모듈로 사용자에게 보여줄 양식파일을
    // 비동기 방식인 readFile 메소드를 이용하여 읽어 옵니다.
    // readFile 인자는 '파일명,인코딩,콜백함수' 이나 인코딩은 생략가능함 
    // 콜백함수 err는 에러값을 data는 읽어온 파일 내용을 갖고 있습니다.
    fs.readFile(__dirname + '/src/client.html', (err, data) => {

        // 에러가 있을 경우 에러 시현
        if (err) throw err;

        // 응답스트림에 해더와 상태코드를 시현
        reponse.writeHead(200, {
            'Content-Type' : 'text/html'
        });
        // 응답 바디값 시현
        reponse.write(data);
        // 종료 요청전송
        reponse.end();

    });
});

// connection 함수가 호출되면 실행할 함수를 바인딩 해 줍니다.
// io.sockets는 나를 포함한 모든 소켓의 객체이며 
// connection은 소켓이 연결되면 호출되는 이벤트 입니다.
// on은 수신, emit는 발신
// connection의 콜백함수를 보면 socket인자가 전달되어 오는데, 
// socket은 접속된 해당 소켓의 객체입니다.
// 소켓연결 중에 어떠한 이벤트를 바인딩하고 싶다면 connection의 콜백함수 스코프내부에 이벤트 리스너를
// 작성하면 됩니다.
io.sockets.on('connection', (socket) => {
    socket.on('newUserConnect', (name) => {
        // socket.name에 name값을 전달해주고 메세지도 작성한다.
        socket.name = name;
        // emit을 통해 updateMessage라는 이벤트를 호출하여 해당 데이터를 객체 리터럴로 전송한다.
        // newUserConnect메쏘드는 서버에서 전달하는 메세지 이므로 name에는 서버라고 작성해준다.
        // index.js의 updateMessage 이벤트를 호출합니다.
        io.sockets.emit('updateMessage', {
            name : 'SERVER',
            message : name + '님이 접속했습니다.'
        });
    });

    // 퇴장할때 메세지 처리
    // io.sockets : 나를 포함한 전체 소켓
    // io.broadcast : 나를 제외한 전체 소켓 (내가 종료하는데 나에게 emit할 필요가 없기때문)
    socket.on('disconnect', () => {

        // index.js의 updateMessage 이벤트를 호출합니다.
        socket.broadcast.emit('updateMessage', {
            name : 'SERVER',
            message : socket.name + '님이 퇴장했습니다.'
        });
    });

    // index.js에서 호출한 sendMessage 이벤트 함수입니다.
    socket.on('sendMessage', (data) => {
        // 채팅 텍스트를 파라메터로 전송했는데, 
        // name값이 있어야 메세지 데이터 구조에 맞기떄문에 data.name값을 담아
        // index.js의 updateMessage 이벤트를 호출합니다.
        data.name = socket.name;
        io.sockets.emit('updateMessage', data);
    })
});

// 생성된 서버를 사용자가 웹에서 확인할 수 있도록 합니다.
// listen 메소드를 사용하여 포트 설정을 합니다.
// 7941포트에 서버가 실행되면 fuction이 실행됩니다.
server.listen(7941, () => {
    console.log('서버실행중');
});
   

관련자료

댓글 0
등록된 댓글이 없습니다.
Total 10 / 1 Page
번호
제목
이름

최근글


새댓글


알림 0