본문으로 바로가기

Node JS 채팅

category JAVASCRIPT/Node.js 2017. 10. 25. 13:59
반응형

Node JS 채팅 소스




이번 포스팅에서는 Node JS를 활용한 채팅 소스를 공유하려고 합니다.

우리가 개발해오면서 웹에서 채팅은 기술적으로 한계를 많이 느끼곤 했었습니다.

처음 개발할때는 polling방식으로 iframe에 요청을 주기적으로 했었습니다.


문제는 불필요한 요청이 너무 많고 주기적으로 호출하는 시간이 너무 애매하다는 결론에 도달 하였고, Long polling 방식인

comet 기술을 사용했었는데요. 어째든 결론은 부족하다 였습니다.


현재는 websocket 기술도 대중화 되어가는 시점인 듯 합니다.


아래는 제가 간단히 작성한 코드입니다.

서버측 소스인 Node JS 스크립트 입니다.

실행을 하게되면 3303포트를 Listen 하게 됩니다. 

아래 소스는 첨부파일을 로컬 경로에 저장하는 부분도 포함되어 있으니 참고하시기 바랍니다.

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

var ss = require('socket.io-stream');

var path = require('path');

var fs = require('fs');

var ipTables = require('./ipTables.js');


console.log('socket server run!!');


io.sockets.on('connection', function(socket){


socket.on('call', function(data){

console.log(data);

io.sockets.emit('answer', getMessage(data));

});


ss(socket).on('upload', function(stream, data){

var fn = path.basename(data.name);

console.log('file upload:'+fn + '  uuid:'+data.uuid);

stream.pipe(fs.createWriteStream('./attachs/'+data.uuid, {defaultEncoding: 'utf8',autoClose: true}));

console.log('send file upload end msg');

});

ss(socket).on('download', function(stream,name,callback){

callback(false, {name:name, size:getFilesizeInBytes(name)});

var mStream = fs.createReadStream('./attachs/'+name);

mStream.pipe(stream);

});


getMessage = function(data) {

var address = data.ip;

var result = {};

result.ctime = getDate();

result.data = data.data;

result.type = data.type;

result.sessionId = data.sessionId;

result.address = address;

return result;

};


getFilesizeInBytes = function(filename) {

var stats = fs.statSync('./attachs/'+filename);

var fileSizeInBytes = stats["size"];

return fileSizeInBytes;

};


getDate = function(){

var d = new Date();

var s = leadingZeros(d.getFullYear(), 4) + '-' + leadingZeros(d.getMonth() + 1, 2) + '-' + leadingZeros(d.getDate(), 2) + ' ' +

leadingZeros(d.getHours(), 2) + ':' + leadingZeros(d.getMinutes(), 2) + ':' + leadingZeros(d.getSeconds(), 2);

return s;

};

leadingZeros = function(n, digits) {

var zero = '';

n = n.toString();

if (n.length < digits) {

for (i = 0; i < digits - n.length; i++)

zero += '0';

}

return zero + n;

}

});


Node JS를 잘 모르신다면 Node.js 홈페이지에서 Guide 문서를 참고하셔야 합니다.


다음 포스팅에는 클라이언트 측 jsp 소스코드를 포스팅 하겠습니다.

궁금한 사항은 언제든지 답글 주세요~


반응형

'JAVASCRIPT > Node.js' 카테고리의 다른 글

Node JS 채팅 jsp 소스  (0) 2018.01.03