내가 이해 한대로 here "V8에는 세대 별 가비지 수집기가 있습니다. 오브젝트를 무작위로 이동합니다. 노드는 소켓에 쓸 원시 문자열 데이터에 대한 포인터를 가져올 수 없습니다." 그래서 나는 그 문자열이 Math.pow(2,16)
바이트보다 커지면, 문자열에 TCP 스트림에서 오는 데이터를 저장해서는 안된다. (지금까지는 바란다.)NodeJS : TCP 소켓 스트림을 처리하는 적절한 방법은 무엇입니까? 어떤 구분 기호를 사용해야합니까?
TCP 소켓에서 오는 모든 데이터를 처리하는 가장 좋은 방법은 무엇입니까? 지금까지 나는 _:_:_
을 구분 기호로 사용하려고 시도 했었습니다. 왜냐하면 나는 그것이 어떻게 든 독특하고 다른 것들을 엉망으로 만들지 않을 것이라고 생각하기 때문입니다. 그것은, 그래서 내가 console.log('MSG' + msg)
하려고 할 때마다
net = require('net');
var server = net.createServer(function (socket) {
socket.on('connect',function() {
console.log('someone connected');
buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16
socket.on('data',function(data) {
if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived...
buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come.
} else { // if there is a separator in the data that arrived
parts = data.toString().split('_:_:_'); // the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages
if (parts.length == 2) {
msg = buf.toString('utf-8',0,4) + parts[0];
console.log('MSG: '+ msg);
buf = (new Buffer(Math.pow(2,16))).write(parts[1]);
} else {
msg = buf.toString() + parts[0];
for (var i = 1; i <= parts.length -1; i++) {
if (i !== parts.length-1) {
msg = parts[i];
console.log('MSG: '+msg);
} else {
buf.write(parts[i]);
}
}
}
}
});
});
});
server.listen(9999);
, 그것은 전체 버퍼를 출력합니다 :
올 것 데이터의 샘플이 내가 할 노력 무엇 something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data
것 무언가가 효과가 있는지보기가 무용지물.
어떻게이 데이터를 적절하게 처리 할 수 있습니까? lazy 모듈은 비록이 데이터가 라인 지향적이지 않더라도 작동할까요? 라인 지향이 아닌 스트림을 처리하는 다른 모듈이 있습니까?
당신이 소켓 * 쓰기 * 정보에 대해 이야기하고 연결하는 프리젠 테이션. 당신은 그것을 읽고 있으므로 걱정은 다릅니다. node.js 0.4.6에서 데이터 콜백은 인코딩을 지정하지 않는 한 이미 버퍼를 제공합니다.이 경우 인코딩을 지정하면 문자열을 얻을 수 있습니다. 데이터를 유지 관리하는 방법은 실제 목표가 무엇인지에 따라 다릅니다. –
들어오는 버퍼를 큰 문자열로 저장할 수 있고 성능 문제가 없다는 뜻입니까? –