4시간동안 삽질한 개행(\n) 처리 문제
////////////////////////////// http호출
var http = require("http");
var options = {
hostname: '',
path : '/data/chart/chart_all.txt',
method:'GET'
/*
path: '/post',
method: 'POST',
headers: {
'Content-Type': 'text/html',
}
*/
};
////////////////////////////// 소켓호출
var io = require('socket.io').listen(8005);
//console.log('socket server run!');
io.sockets.on('connection', function(socket){
//메세지 수신시
/*
socket.on('send', function(res){
//socket.emit('recv', data); //메세지를 발송한 본인에게만
//io.emit('recv', res); //전체 커넥션 유저들에게
});
//브라우저를 떠날때 실행됨
socket.on('disconnect', () => {
});
*/
});
setInterval(function(){
var currentDate = new Date();
var secodes = currentDate.getSeconds();
if(secodes % 1 == 0) //1초마다 푸쉬
{
//console.log('secodes => ' + secodes);
var req = http.request(options, function(res) {
//console.log('Status: ' + res.statusCode); //200 => success
//console.log('Headers: ' + JSON.stringify(res.headers));
res.setEncoding('utf-8');
var all_string = "";
res.on('data', function (body) {
//console.log('success');
//body = body.replace(/\r/g, "");
//body = body.replace(/\n/g, "");
body = body.replace(/\r/gi, '');
body = body.replace(/\n/gi, '');
body = body.replace(/\t/gi, '');
body = body.replace(/\f/gi, '');
//body = escape(body);
/*
console.log("=============start===============");
console.log(body);
console.log("=============end===============");
*/
all_string += body;
//io.emit('recv', body); //전체 커넥션 유저들에게
});
res.on('end', function(){
//console.log("=============start===============");
//console.log(all_string);
//console.log("=============end===============");
io.emit('recv', all_string); //전체 커넥션 유저들에게
});
//console.log('http end');
});
req.on('error', function(e) {
//console.log('problem with request: ' + e.message);
});
//console.log('start2');
req.write('{}');
req.end();
}
}, 1000);
function escape(str) {
return str
.replace(/[\\]/g, '\\\\')
// .replace(/[\"]/g, '\\\"')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t');
};
================================================================================================
사건의 발단은 JSON 데이터를 수신받는 클라이언트 쪽에서 JSON 데이터를 온건하게 받지 못하는 부분부터 시작되었다.
console 로 찍어보니 중간에 JSON 데이터가 뚝 끊어져서 들어오는 것이었다.
그래서 서버쪽에서 전달을 잘못하고 있겠거니와, 분석을 시작하였다.
일단 서버쪽에서 cossole 을 찍어보니, 문자열 중간에 개행(\n) 이 확인되었다.
개행이 왜 발생한건지는 모르겠으나, 개행을 공백으로 치환해주었다. 하지만 문제는 해결되지 않았다.
개행안에 눈으로 확인 불가능한 이상한 문자열이 있나??? 싶어서 별의별 치환을 해보았지만 해결이 되지 않았다.
심지어는 인코딩해서 클라이언트 쪽으로 전송해보았으나 안되었다.
그러다가 디버깅을 계속 시도한 결과, 해당 JSON 데이터 문자열은 끊어서 생성이 된다는 것을 알아내었다.
그래서 all_string 변수를 만들어서 하나로 엮어서 한꺼번에 클라이언트들에게 전송하니 성공적으로 전송이 됨을 확인하였다.
nodejs 의 http 라이브러리는 data 수신시에 특정 byte 만큼 끊어서 전송받는다~